[英]Python subprocess popen pipe
我試圖在python中發出命令並讀取輸入並將其解析回去。 這是我要發出的命令(例如在命令行上運行時的示例)
-bash-3.2$ echo "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000
PASSTHRU TST,1234
udp_send_command: timed out waiting for response
-bash-3.2$
我正在嘗試使用python子進程
vsh_command = ' "passthru ' + cmd + '" | ./vsh -a ' + ip_address + ' -p ' + port
print vsh_command
new_command = ['echo', vsh_command]
print new_command
proc = subprocess.Popen(new_command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
shell=True)
print '1'
out_2, err = proc.communicate()
print out_2
print '2'
rcv = out_2.splitlines()
print '3'
for r in rcv:
print ' ' + r
print '4'
`
"passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000
['echo', ' "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000']
1
2
3
4
是一個| 子進程無法使用命令? 如果是這樣,還有另一種方法可以運行此shell命令並獲取輸入嗎?
更新:(使用單個字符串表示shell = true命令)
`vsh_command = 'echo "passthru ' + cmd + '" | ./vsh -a ' + ip_address + ' -p ' + port
print vsh_command
proc = subprocess.Popen(vsh_command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
shell=True)
print '1'
out_2, err = proc.communicate()
print out_2
print '2'
rcv = out_2.splitlines()
print '3'
for r in rcv:
print ' ' + r
print '4'
`
運行(Python腳本)
echo "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000
1
PASSTHRU TST,1234
2
3
PASSTHRU TST,1234
4
SUCCESS
仍然不是我正在尋找的東西,看起來它只是在執行echo命令而不是管道
編輯#2
p = Popen(["./vsh", "-a", ip_address, "-p", str(port)],stdin=PIPE, stdout=PIPE)
out, err = p.communicate("passthru TST,1234")
print '----------'
print out
輸出:
-bash-3.2$ python mfd_ascii_test.py
udp_send_command: timed out waiting for response
----------
PASSTHRU TST,1234
-bash-3.2$
out是回聲的結果,而不是“ udp_send_command:超時等待響應”
如果要將輸出從一個管道傳遞到另一個,則可以將標准輸出從一個進程傳遞到另一個進程的標准輸入:
from subprocess import PIPE,Popen
p1 = Popen(["echo", "passthru TST,1234"],stdout=PIPE)
p2 = Popen(["./vsh", "-a", "127.0.0.1", "-p", "7000"],stdin=p1.stdout,stdout=PIPE,stderr=PIPE)
p1.stdout.close()
out, err = p2.communicate()
如果要使用豎線字符,則需要設置shell = True並傳遞單個字符串:
from subprocess import check_output
out = check_output('echo "passthru TST,1234" | ./vsh -a 127.0.0.1 -p 7000',shell=True)
要將字符串作為輸入傳遞給子流程並捕獲其輸出,可以使用Popen.communicate()
方法 :
#!/usr/bin/env python2
from subprocess import Popen, PIPE, STDOUT
p = Popen(["./vsh", "-a", ip_address, "-p", str(port)],
stdin=PIPE, stdout=PIPE, stderr=STDOUT)
output = p.communicate("passthru " + cmd)[0]
stderr=STDOUT
將stderr合並到stdout中。
設置stdout=PIPE
捕獲stdout,設置stderr=PIPE
捕獲stderr; 否則, communicate()
對於相應的管道返回None
。 如果該進程可能在stdout之外寫,則stderr然后使用pexpect
或pty
+ select
模塊 。 這是pexpect.runu()
和pty.spawn()
代碼示例 。
如果將shell=True
設置shell=True
則可以直接將字符串命令與subprocess.check_output
一起使用(使用python 2.7)。
output = subprocess.check_output(" ".join(new_command), shell=True)
或者,您可以使用subprocess.Popen
(python <2.7)。
output, err = subprocess.Popen(" ".join(new_command), stdout=subprocess.PIPE, shell=True).communicate()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.