簡體   English   中英

Python子進程Popen管道

[英]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然后使用pexpectpty + 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM