os.popen 子进程转换
这段代码可以让我获取到我BSD网络接口的点分十进制地址(就是我们常说的IP地址)。
ifcfg_lines = os.popen("/sbin/ifconfig fxp0").readlines()
x = string.split(ifcfg_lines[3])[1]
看起来我不能完全一样地使用subprocess模块。我觉得我不想用shell=True或者PIPE。那我该怎么做才能让输出可以被索引呢?
谢谢。
2 个回答
0
为什么不使用类似下面的代码呢:
import socket
ipadr = socket.gethostbyname(socket.gethostname())
就像在Python中查找本地IP地址的讨论中提到的那样,这样可以去掉对子进程的依赖?在那个问题里还有其他一些建议。
我还发现了一个关于netifaces包的帖子,它的目标是提供更好的跨平台支持来实现这个功能。
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])
如果你打算用子进程来实现这个功能,那么优雅性就有点受限了,因为你实际上是在做类似于屏幕抓取的事情,只不过这里是脚本抓取。如果你想要一个真正通用的解决方案,可以使用socket库,也就是说让Python来处理跨平台的问题。
很多时候,当你看到一段代码,想要找到更好、更简洁的写法时,这其实是在提醒你要重新审视自己的假设,可能需要改变算法或解决方案的架构。