2009-10-20 53 views
0

這段代碼讓我知道了我的BSD網絡接口的虛線四邊形。 我想弄清楚如何使用子流程模塊。os.popen子進程轉換

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

好像我不能以完全相同的方式使用子過程。 我不認爲我想要shell = True或PIPE。 我應該怎麼做才能使輸出可以索引?

謝謝。

回答

0

爲什麼不使用這樣的:

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

Finding Local IP Addresses in Python和刪除子進程依賴?這個問題還有其他一些建議。

我還在netifaces軟件包中發現了一個帖子,其目標是通過更好的跨平臺支持來實現此目的。

+0

heh。我以一種不太優雅的方式使用套接字模塊,但發現由於DNS,我得到了錯誤的IP。 服務器是國內寬帶網絡客戶端,因此除非我的dyndns.org主機名解析正確,否則DNS將會出錯。 – 2009-10-20 00:18:36

+0

夠公平的,我想知道這是爲什麼你通過設備名稱獲取IP。 netifaces方法如何?它使用系統調用而不是dns。 – 2009-10-20 00:20:36

+0

我一直在這樣做: CURRENT = socket.getaddrinfo(socket.gethostname(),None)[0] [4] [0] 無論出於何種原因,上述(和你的)語法返回173.48.208.152而/ sbin/ifconfig fxp0呈現:173.48.204.168。 – 2009-10-20 00:22:48

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]) 

如果你要使用子這樣做,則優雅是有點有限的,因爲你基本上是做一些像屏幕抓取,除了這裏你是scriptscraping。如果您想要一個真正的通用解決方案,請使用套接字庫,即讓Python處理可移植性。

通常,當您查看一些代碼並希望有更好的更乾淨的方法來實現時,這意味着您需要質疑您的假設,並更改解決方案的算法或體系結構。

+0

您還需要導入PIPE – 2009-10-20 00:21:03

+0

呃。是啊。我似乎沒有PIPE模塊。 PIPE來自哪裏? – 2009-10-20 00:39:04

+0

http://docs.python.org/library/subprocess.html有關「必須指定stdin = PIPE和stdout = PIPE」的討論。 所以我指定他們和蟒蛇不知道跆拳道我在說:) – 2009-10-20 00:45:45