Python 子进程打开管道
Python subprocess popen pipe
我正在尝试在 python 中发出命令并读取输入并将其解析回来。这是我要发出的命令(例如在命令行上 运行ning 时)
-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: timed out waiting for response'
如果你想将一个进程的输出通过管道传输到另一个进程,你可以将一个进程的标准输出通过管道传输到另一个进程的标准输入:
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)
如果设置 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()
要将字符串作为输入传递给子进程并捕获其输出,您可以使用 Popen.communicate()
method:
#!/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()
returns None
用于相应的管道。如果进程可能在 stdout、stderr 之外写入,则 use pexpect
or pty
+ select
modules. Here's pexpect.runu()
and pty.spawn()
code examples.
我正在尝试在 python 中发出命令并读取输入并将其解析回来。这是我要发出的命令(例如在命令行上 运行ning 时)
-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: timed out waiting for response'
如果你想将一个进程的输出通过管道传输到另一个进程,你可以将一个进程的标准输出通过管道传输到另一个进程的标准输入:
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)
如果设置 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()
要将字符串作为输入传递给子进程并捕获其输出,您可以使用 Popen.communicate()
method:
#!/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()
returns None
用于相应的管道。如果进程可能在 stdout、stderr 之外写入,则 use pexpect
or pty
+ select
modules. Here's pexpect.runu()
and pty.spawn()
code examples.