Popen子进程出现问题

3

我正在尝试学习subprocessing模块,并因此成为了一个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为PIPE,则它可以正常工作。而 hlds.communicate('quit')似乎也没有发送到hlds进程的标准输入。 ls -l命令返回stdout正确,但hlds没有。

非常感谢您的帮助! :)

1个回答

3
请参考Popen.communicate文档(强调我的部分):
与进程交互:将数据发送到stdin。读取stdout和stderr的数据,直到达到文件结尾。等待进程终止。可选的输入参数应该是要发送到子进程的字符串,或者如果不需要向子进程发送数据,则为None。
因此,在一次进程运行中,您只能调用一次communicate,因为它会等待进程终止。这就是为什么ls -l似乎可以工作——它立即终止,而hlds则不行。
您需要执行以下操作:
out, error = hlds.communicate('quit')

如果您想发送quit并获取所有输出直到它终止。

如果您需要更多交互性,您需要直接使用hlds.stdouthlds.stdinhlds.stderr


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接