Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python os.popen子进程转换_Python_String_Indexing_Subprocess - Fatal编程技术网

Python os.popen子进程转换

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

这段代码让我看到了BSD网络接口的虚线四元组。 我想知道如何使用子流程模块

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地址。但还有更优雅的方式吗?