有没有办法在Popen的同一个“会话”中进行多次通话?例如,我可以通过它进行调用,然后再调用另一个调用,而不必将命令连接成一个长字符串吗?
答案 0 :(得分:3)
当你使用popen时,你不是“打电话”,你正在运行一个可执行文件并通过stdin,stdout和stderr与它交谈。如果可执行文件有某种方式来执行“会话”工作(例如,通过从stdin读取行),那么,是的,你可以做到。否则,你需要执行多次。
subprocess.Popen(大部分)只是execvp(3)
的包装器答案 1 :(得分:1)
假设您希望能够运行shell并向其发送多个命令(并读取它们的输出),看起来您可以执行以下操作:
from subprocess import *
p = Popen(['/bin/sh'], shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE)
之后,例如:
>>> p.stdin.write("cat /etc/motd\n")
>>> p.stdout.readline()
'Welcome to dev-linux.mongo.com.\n'
(当然,您也应该检查stderr
,否则请Popen
将其与stdout
合并。上面提到的一个主要问题是stdin
和stdout
管道处于阻塞模式,因此很容易“卡住”等待shell的输出。虽然我没有尝试过,但ActiveState网站上有一个recipe,显示了如何解决这个问题。
更新:在查看相关问题/答案之后,看起来使用Python的内置select
模块来查看是否有要读取的数据可能更简单{1}}(当然,你也应该为stdout
做同样的事情),例如:
stderr
答案 2 :(得分:0)
例如,我可以通过它进行调用,然后再调用另一个调用,而不必将命令连接成一个长字符串吗?
听起来你正在使用shell = True。不要,除非你需要。而是使用shell = False(默认值)并传入命令/ arg列表。
有没有办法在Popen的同一个“会话”中进行多次通话?例如,我可以通过它进行调用,然后再调用另一个调用,而不必将命令连接成一个长字符串吗?
任何原因你不能只创建两个Popen实例并在必要时等待/通信?如果我理解正确的话,这是正常的做法。