os.popen 子进程转换

0 投票
2 回答
986 浏览
提问于 2025-04-15 15:11

这段代码可以让我获取到我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来处理跨平台的问题。

很多时候,当你看到一段代码,想要找到更好、更简洁的写法时,这其实是在提醒你要重新审视自己的假设,可能需要改变算法或解决方案的架构。

撰写回答