我正在努力学习子处理模块,因此成为一名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。
感谢大家的帮助:)

最佳答案

参见Popen.communicate docs(强调我的):
与进程交互:将数据发送到stdin。从stdout和stderr读取数据,直到到达文件末尾。等待进程终止。可选的输入参数应该是要发送给子进程的字符串,如果不应该向子进程发送数据,则为“无”。
因此,每次进程运行只能调用communicate一次,因为它会等待进程终止。这就是为什么ls -l似乎有效——它立即终止,而hlds则不起作用。
你需要做的是:

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

如果您想发送quit并获取所有输出,直到它终止。
如果需要更多的交互性,则需要直接使用hlds.stdout, hlds.stdin, and hlds.stderr

10-07 18:15