我正在尝试了解子处理模块,因此正在建立一个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。
所有帮助表示赞赏! :)
答案 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
。