我正在努力学习子处理模块,因此成为一名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
。