2 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的 shell 命令正在調(diào)用兩個(gè)命令, 的輸出ifconfig用作sed. 您可以使用 subprocess 來模擬它,但sed調(diào)用只是進(jìn)行一些文本操作,因此更簡潔的方法是在該步驟中使用 Python。例如:
import re
import subprocess
pattern = r'inet (?:addr:)?(?!127\.0\.0\.1)((?:\d+\.){3}\d+)'
p = subprocess.Popen(['ifconfig'], stdout=subprocess.PIPE)
text = re.search(pattern, p.stdout.read()).group(1)
retcode = p.wait()

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
您正在嘗試調(diào)用 2 個(gè) shell 命令,ifconfig并且sed,沒關(guān)系。但是,這些是 shell 命令,在調(diào)用subprocess.Poen.
使用communictae方法,最好用在這里。并將命令作為字符串而不是列表發(fā)送。
import subprocess
command = ' '.join(['ifconfig', '|', 'sed', '-En', 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'])
p = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
stdoutdata, stderrdata = p.communicate() #this is blocking
for line in stdoutdata:
#do some thing with line
Popen.communicate(input=None)
與進(jìn)程交互:將數(shù)據(jù)發(fā)送到標(biāo)準(zhǔn)輸入。從 stdout 和 stderr 讀取數(shù)據(jù),直到到達(dá)文件末尾。等待進(jìn)程終止??蛇x的輸入?yún)?shù)應(yīng)該是一個(gè)要發(fā)送給子進(jìn)程的字符串,如果沒有數(shù)據(jù)應(yīng)該發(fā)送給子進(jìn)程,則為 None。
添加回答
舉報(bào)