Python os.popen子进程转换
这段代码让我看到了BSD网络接口的虚线四元组。 我想知道如何使用子流程模块Python os.popen子进程转换,python,string,indexing,subprocess,Python,String,Indexing,Subprocess,这段代码让我看到了BSD网络接口的虚线四元组。 我想知道如何使用子流程模块 ifcfg_lines = os.popen("/sbin/ifconfig fxp0").readlines() x = string.split(ifcfg_lines[3])[1] 似乎我不能以完全相同的方式使用子流程。 我想我不想要shell=True或PIPE。 我应该如何使输出可索引 谢谢。为什么不使用类似于: import socket ipadr = socket.gethostbyname(socke
ifcfg_lines = os.popen("/sbin/ifconfig fxp0").readlines()
x = string.split(ifcfg_lines[3])[1]
似乎我不能以完全相同的方式使用子流程。
我想我不想要shell=True或PIPE。
我应该如何使输出可索引
谢谢。为什么不使用类似于:
import socket
ipadr = socket.gethostbyname(socket.gethostname())
如中所示,是否删除子流程依赖项?在这个问题上还有其他一些建议
我还在软件包上找到了一篇文章,旨在通过更好的跨平台支持实现这一点
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处理可移植性
通常,当您查看一些代码时,如果希望有更好、更干净的方法来执行,这意味着您需要质疑您的假设,并更改解决方案的算法或体系结构。Heh。我以一种不那么优雅的方式使用套接字模块,但发现由于DNS的原因,我得到了错误的IP。服务器是一个国内宽带网络客户端,因此DNS将是错误的,除非我的dyndns.org主机名正确解析,这是不公平的。我想知道这是否就是为什么你要按设备名获取ip。这种方法怎么样?它使用系统调用而不是dns。我一直在这样做:CURRENT=socket.getaddrinfo(socket.gethostname(),None)[0][4][0],无论出于何种原因,/sbin/ifconfig fxp0呈现:173.48.204.168时,上述(以及您的)语法返回173.48.208.152。我不熟悉netifaces.Uh。是 啊我似乎没有管道模块。管子到底是从哪里来的?谈到“必须指定stdin=PIPE和stdout=PIPE”。所以我确实指定了它们,python不知道我所说的wtf:)
从子流程导入Popen,PIPE
真的吗?为什么我需要指定它?反问句。我知道你不是Guido.CURRENT=Popen(“/sbin/ifconfig fxp0”,shell=True,stdout=PIPE)。stdout.readlines()这是可行的,x=string.split(CURRENT[3])[1]现在可以获得正确的IP地址。但还有更优雅的方式吗?