如果我使用给定命令在python中生成一个新的subprocess
(假设我用python
命令启动python解释器),我该如何向进程发送新数据(通过STDIN) ?
答案 0 :(得分:11)
使用标准subprocess模块。您使用subprocess.Popen()来启动进程,它将在后台运行(即与您的Python程序同时运行)。当您调用Popen()时,您可能希望将stdin,stdout和stderr参数设置为subprocess.PIPE。然后,您可以使用返回对象上的stdin,stdout和stderr字段来写入和读取数据。
未经测试的示例代码:
from subprocess import Popen, PIPE
# Run "cat", which is a simple Linux program that prints it's input.
process = Popen(['/bin/cat'], stdin=PIPE, stdout=PIPE)
process.stdin.write(b'Hello\n')
process.stdin.flush()
print(repr(process.stdout.readline())) # Should print 'Hello\n'
process.stdin.write(b'World\n')
process.stdin.flush()
print(repr(process.stdout.readline())) # Should print 'World\n'
# "cat" will exit when you close stdin. (Not all programs do this!)
process.stdin.close()
print('Waiting for cat to exit')
process.wait()
print('cat finished with return code %d' % process.returncode)
答案 1 :(得分:3)
别。
如果要将命令发送到子进程,请创建一个pty,然后将子进程分叉,并将pty的一端附加到其STDIN。
以下是我的部分代码的摘录:
RNULL = open('/dev/null', 'r')
WNULL = open('/dev/null', 'w')
master, slave = pty.openpty()
print parsedCmd
self.subp = Popen(parsedCmd, shell=False, stdin=RNULL,
stdout=WNULL, stderr=slave)
在这段代码中,pty附加到stderr,因为它接收错误消息而不是发送命令,但原理是相同的。
答案 2 :(得分:0)
由Subprocess创建的用于触发多个命令的隧道无法保持活动状态。为了达到这个目的,你可以查看paramiko,对于其他东西,比如subprocess stdin,stdout,stderr,你可以通过这个链接python subprocess,因为这是你的第一个python项目,你最好阅读并尝试一些东西。