保持子进程活着并继续给它命令? Python

Posted

技术标签:

【中文标题】保持子进程活着并继续给它命令? Python【英文标题】:Keep a subprocess alive and keep giving it commands? Python 【发布时间】:2012-03-08 12:44:27 【问题描述】:

如果我使用给定命令在 python 中生成一个新的subprocess(假设我使用python 命令启动 python 解释器),我如何向进程发送新数据(通过 STDIN)?

【问题讨论】:

子进程创建的用于触发多个命令的隧道无法保持活动状态。为了实现这一点,您可以查看 paramiko,对于子进程 stdin、stdout、stderr 等其他内容,您可以通过此链接 python subprocess,因为这是您的第一个 python 项目,您最好阅读并尝试一些东西。 如果它是一个你想自动化交互的 shell,pexpect 非常适合这种事情。 【参考方案1】:

使用标准的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)

【讨论】:

假设我需要同时运行多个进程。使用Popen() 生成大量子进程还是“分叉”更好? Popen 确实分叉了这些进程。这只是您是否想自己进行低级分叉或是否希望将其包含在更高级别的库中的问题。最终结果完全一样。 那么几个并发的 Popens 不会让系统陷入困境吗?谢谢,我试试看。【参考方案2】:

不要。

如果您想向子进程发送命令,请创建一个 pty,然后分叉子进程,并将 pty 的一端附加到其 STDIN。

这是我的一些代码中的一个 sn-p:

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是因为它接收错误信息而不是发送命令,但原理是一样的。

【讨论】:

不要在子进程中使用 pty.openpty() - 这太复杂了。使用 subprocess.PIPE,让 subprocess 模块为您处理它。 (除了更简单、更标准之外,它还将使用比 PTY 更轻的管道)。

以上是关于保持子进程活着并继续给它命令? Python的主要内容,如果未能解决你的问题,请参考以下文章

Python windows脚本子进程在脚本结束后继续输出

从 python 子进程获取输出并向其发出命令

使用 Python 子进程调用 cmd 并传递参数

Python子进程python脚本

如何写入 Python 子进程的标准输入?

合并Python脚本的子进程'stdout和stderr,同时保持它们可区分