python子进程没有';当有';没有连接控制台

python子进程没有';当有';没有连接控制台,python,python-3.x,subprocess,discord.py,Python,Python 3.x,Subprocess,Discord.py,我一直在尝试制作自己的discord机器人,其目标是执行任意代码,我对结果非常满意。然而,似乎每当从任何地方启动bot时,如果没有连接控制台(即Systemd units、cron…),其行为都是意外的,并且无法正确获取输入或输出。但是,如果它是从ssh或从计算机本身启动的,则所有这些都不会发生 经过一些尝试和错误,我最终认为这一定是由于子进程处理stdout和stderr的方式造成的,但我不确定发生了什么。这是处理子流程生成的代码部分 def_subprocess(path_to_execut

我一直在尝试制作自己的discord机器人,其目标是执行任意代码,我对结果非常满意。然而,似乎每当从任何地方启动bot时,如果没有连接控制台(即Systemd units、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
def_子进程(路径到可执行文件)
超时标志=True
运行\u进程=子进程.Popen(路径\u到\u可执行文件,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
尝试:
stdout,stderr=run\u进程通信(超时=5)
除subprocess.TimeoutExpired外:
标准输出,标准输出,超时标志=超时(运行进程)
返回标准输出解码(“utf-8”),标准输出解码(“utf-8”),超时标志
def超时(进程):
线号=0
stderr=b“”
标准输出=b“”
当线号小于5时:
stdout+=process.stdout.readline()
行号+=1
process.kill()
超时标志=True
返回标准输出、标准输出、超时标志
它看起来不像没有标准输出或标准输出,相反,它感觉它没有等待进程完成,它只是输出垃圾(给机器人相同的输入并不保证相同的输出,如图所示:)


我对此感到困惑,也不知道会发生什么。

虽然不是真正的解决方案,但我已经找到了一个不错的解决办法,将屏幕作为systemd和我的机器人之间的中介。Systemd在引导时启动screen,screen处理我的bot而不显示任何问题。我会坚持这一点。

discord.py
是基于
asyncio
构建的,您的代码是否在不应该阻塞的时候阻塞了?启动bot的控制台中是否出现错误/输出?机器人产生的任何python错误都将输出到那里。这就是问题所在,当它从控制台启动时,这些行为都不会发生。相反,我得到了一切正常的预期行为。当它没有连接控制台时,它就不工作了,当这种情况发生时,我无法检查输出。对不起,我忘了提到你@PatrickHaugh。这很奇怪。您对可执行文件的路径使用什么类型的值?@PatrickHaugh。我很抱歉,如果这是坏的,这是我的第一个“体面”的项目之一。