3

我正在尝试了解子处理模块,因此正在成为 hlds 服务器管理员。

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

到目前为止,我已经进行了一些初步测试,但已经卡住了:]

#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 服务器获得任何标准输出,但如果我不将标准输出设置为 PIPE,它工作正常。而且hlds.communicate('quit')似乎也没有发送到 hlds 进程标准输入。ls -l 命令正确返回标准输出,但不返回 hlds。

所有帮助表示赞赏!:)

4

1 回答 1

3

请参阅Popen.communicate文档(强调我的):

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

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

你需要这样做:

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

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

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

于 2012-04-12T20:42:03.603 回答