Popen子处理问题

时间:2012-04-12 20:33:36

标签: python subprocess popen

我正在尝试了解子处理模块,因此正在建立一个hlds服务器管理员。

我的目标是能够启动服务器实例并通过dispatcher.py发送所有命令来管理多个服务器,例如:将命令发送到子进程stdin。

我到目前为止已经进行了一些初步测试,但已经陷入困境:]

#dispatcher.py
import subprocess

RUN = '/home/daniel/hlds/hlds_run -game cstrike -map de_dust2 -maxplayers 11'
#RUN = "ls -l" 

hlds = subprocess.Popen(RUN.split(), stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

print hlds.communicate()[0]

print hlds.communicate()[1]

hlds.communicate('quit')

我没有从hlds服务器获得任何stdout,但如果我没有将stdout设置为PIPE,它可以正常工作。并且hlds.communicate('quit')似乎也没有被发送到hlds进程stdin。 ls -l命令正确返回stdout但不是hlds。

所有帮助表示赞赏! :)

1 个答案:

答案 0 :(得分:3)

参见Popen.communicate docs(强调我的):

  

与流程交互:将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。 等待进程终止。可选的输入参数应该是要发送到子进程的字符串,如果没有数据应该发送给子进程,则为None。

因此,每次运行一次只能调用communicate 一次,因为它等待进程终止。这就是ls -l似乎有效的原因 - 它会立即终止,而hlds则不会。

你需要这样做:

out, error = hlds.communicate('quit')

如果你想发送quit并获得所有输出,直到它终止。

如果您需要更多互动,则需要直接使用hlds.stdout, hlds.stdin, and hlds.stderr