当没有附加控制台时,python子进程似乎无法正常工作

时间:2017-08-26 18:10:49

标签: python python-3.x subprocess discord.py

我一直在尝试制作针对任意代码执行的自己的不和谐机器人,我对结果非常满意。但是,似乎无论何时从没有连接控制台的任何地方启动机器人(即系统单元,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保证相同的输出,如下图所示:)

as you can see in this image.

and in this other one too

我对此感到困惑,而且我对可能发生的事情一无所知。

1 个答案:

答案 0 :(得分:0)

虽然不是真正的解决方案,但我通过使用屏幕作为systemd和我的机器人之间的中介,找到了一个不错的解决方法。 Systemd在启动时启动屏幕,屏幕处理我的机器人而不会出现任何问题。我会坚持这一点。