python subprocess在没有连接控制台的情况下似乎无法正常工作
问题描述:
我一直试图让自己的不和机器人针对任意代码执行,我对结果很满意。然而,似乎只要从任何地方没有连接到控制台的机器人(即Systemd单元,cron ...)启动机器人,行为就会出乎意料,并且无法正确获取输入或输出。但是,如果它是从ssh或电脑本身启动的,则不会发生这种情况。python subprocess在没有连接控制台的情况下似乎无法正常工作
经过一些试验和错误,我最终认为这必须是由subprocess处理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
它似乎并不像有没有标准输出或标准错误,而不是感觉它不等待进程结束,它只是输出垃圾(给机器人相同的输入不保证相同的输出,你可以在这个图片看:)
我在这个我难住了,我没有什么可能会发生什么想法。
答
虽然不是一个真正的解决方案,但我通过使用屏幕作为systemd和我的机器人之间的中介,找到了一个体面的解决方法。 Systemd在启动时启动屏幕,并且屏幕可以处理我的机器人,而不会出现任何问题。我会坚持这一点。
'discord.py'构建于'asyncio'上,当你的代码不应该阻塞时?你是否在启动机器人的控制台中收到错误/输出?机器人产生的任何python错误都会输出到那里。 –
这是帕特里克的问题,当它从控制台启动时,没有任何行为发生。相反,我会得到预期的行为,一切正常。当它没有连接控制台时它不起作用,当发生这种情况时,我无法检查输出。 – Kurolox
对不起,我忘了提及你@PatrickHaugh。 – Kurolox