2017-08-26 75 views
2

我一直试图让自己的不和机器人针对任意代码执行,我对结果很满意。然而,似乎只要从任何地方没有连接到控制台的机器人(即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 

它似乎并不像有没有标准输出或标准错误,而不是感觉它不等待进程结束,它只是输出垃圾(给机器人相同的输入不保证相同的输出,你可以在这个图片看:)

as you can see in this image.

and in this other one too

我在这个我难住了,我没有什么可能会发生什么想法。

+1

'discord.py'构建于'asyncio'上,当你的代码不应该阻塞时?你是否在启动机器人的控制台中收到错误/输出?机器人产生的任何python错误都会输出到那里。 –

+0

这是帕特里克的问题,当它从控制台启动时,没有任何行为发生。相反,我会得到预期的行为,一切正常。当它没有连接控制台时它不起作用,当发生这种情况时,我无法检查输出。 – Kurolox

+0

对不起,我忘了提及你@Pa​​trickHaugh。 – Kurolox

回答

0

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

相关问题