【问题标题】:os.popen subprocess conversionos.popen 子进程转换
【发布时间】:2009-10-20 00:08:30
【问题描述】:

这个 sn-p 让我得到了我的 BSD 网络接口的虚线四边形。 我想弄清楚如何改用 subprocess 模块。

ifcfg_lines = os.popen("/sbin/ifconfig fxp0").readlines()
x = string.split(ifcfg_lines[3])[1]

似乎我不能以完全相同的方式使用子进程。 我不认为我想要 shell=True 或 PIPE。 我应该怎么做才能使输出可索引?

谢谢。

【问题讨论】:

    标签: python string indexing subprocess


    【解决方案1】:
    from subprocess import Popen, PIPE
    
    ifcfg_lines = Popen("/sbin/ifconfig fxp0",shell=True,stdout=PIPE).stdout.readlines()
    x = string.split(ifcfg_lines[3])[1]
    

    为了更优雅,隐藏细节:

    def getBSDIP():
       from subprocess import Popen, PIPE
       import string
    
       CURRENT = Popen("/sbin/ifconfig fxp0", shell=True,stdout=PIPE).stdout.readlines()
       return(string.split(CURRENT[3])[1]) 
    

    如果您打算使用子流程来执行此操作,那么优雅会受到一些限制,因为您本质上是在做一些类似屏幕抓取的事情,除了这里您是脚本抓取。如果您想要一个真正通用的解决方案,请使用套接字库,即让 Python 处理可移植性。

    通常,当您查看一段代码并希望有一种更简洁的方法来执行此操作时,这意味着您需要质疑您的假设,并更改解决方案的算法或架构。

    【讨论】:

    • 呃。是的。我似乎没有 PIPE 模块。 PIPE到底是从哪里来的?
    • docs.python.org/library/subprocess.html 谈到“必须指定 stdin=PIPE 和 stdout=PIPE”。所以我确实指定了它们,python 不知道我在说什么 :)
    • from subprocess import Popen,PIPE
    • 真的吗?为什么我需要指定它?修辞问题。我知道你不是圭多。
    • CURRENT = Popen("/sbin/ifconfig fxp0", shell=True,stdout=PIPE).stdout.readlines() 这有效并且 x = string.split(CURRENT[3])[1 ] 现在可以获得正确的 IP 地址。但是有没有更优雅的方式呢?
    【解决方案2】:

    为什么不使用类似的东西:

    import socket
    ipadr = socket.gethostbyname(socket.gethostname())
    

    Finding Local IP Addresses in Python 并删除子进程依赖项?该问题中还有其他一些建议。

    我还在netifaces 包上找到了一篇帖子,旨在通过更好的跨平台支持来做到这一点。

    【讨论】:

    • 嘿。我以一种不太优雅的方式使用套接字模块,但发现由于 DNS,我得到了错误的 IP。该服务器是国内宽带网络客户端,因此除非我的 dyndns.org 主机名正确解析,否则 DNS 会出错。
    • 很公平,我想知道这是否就是您通过设备名称获取 ip 的原因。 netifaces 方法怎么样?它使用系统调用而不是 dns。
    • 我一直在这样做: CURRENT = socket.getaddrinfo(socket.gethostname(), None)[0][4][0] 无论出于何种原因,上述(和您的)语法都会返回173.48.208.152 而 /sbin/ifconfig fxp0 呈现:173.48.204.168 .
    • 我不熟悉netifaces。
    猜你喜欢
    • 2020-02-09
    • 2018-09-24
    • 2023-03-17
    • 2012-03-25
    • 1970-01-01
    • 2023-03-20
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多