我一直在尝试制作针对任意代码执行的自己的不和谐机器人,我对结果非常满意。但是,似乎无论何时从没有连接控制台的任何地方启动机器人(即系统单元,cron ......),行为都是意外的,并且它无法正确获取输入或输出。但是,如果它是从ssh或从计算机本身启动的,则不会发生这种情况。
经过一些反复试验,我最终认为这必须是由子进程处理stdout和stderr引起的,但我不确定发生了什么。这是处理子流程生成的代码的一部分。
def_subprocess(path_to_executable)
timeout_flag = True
run_process = subprocess.Popen(path_to_executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
try:
stdout, stderr = run_process.communicate(timeout=5)
except subprocess.TimeoutExpired:
stdout, stderr, timeout_flag = timeout(run_process)
return stdout.decode("utf-8"), stderr.decode("utf-8"), timeout_flag
def timeout(process):
line_number = 0
stderr = b""
stdout = b""
while line_number < 5:
stdout += process.stdout.readline()
line_number += 1
process.kill()
timeout_flag = True
return stdout, stderr, timeout_flag
它似乎没有stdout或stderr,相反它感觉它不等待过程完成它只是输出垃圾(给机器人相同的输入并没有&) #39; t保证相同的输出,如下图所示:)
我对此感到困惑,而且我对可能发生的事情一无所知。
答案 0 :(得分:0)
虽然不是真正的解决方案,但我通过使用屏幕作为systemd和我的机器人之间的中介,找到了一个不错的解决方法。 Systemd在启动时启动屏幕,屏幕处理我的机器人而不会出现任何问题。我会坚持这一点。