2017-11-25 396 views
1

我想在后台使用subprocess popen执行批处理文件,但是当批处理文件中有回声时它会停止执行。Python:在后台批处理文件上运行subprocess.Popen停止回声

这是我使用Python中的内容:

subprocess.Popen("test.bat", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

这是一个示例批处理文件使用测试,我真正的批处理文件失败,以至于即时通讯:

@ECHO OFF 
ECHO %date% %time%: Test 1 >> test.txt 
ECHO Test 1 
ECHO %date% %time%: Test 2 >> test.txt 
ECHO Test 2 

执行此操作时,它几乎总是停在“ECHO Test 1”上,因为text.txt文件不会填入“测试2”文本。如果您删除或注释掉“ECHO Test 1”,它就可以工作。在我真正的批处理文件中,这并非如此简单,它也会在回声结束后停止,以便在多个文件中尝试。

它在手动执行批处理文件时起作用,因为它在回显后继续。 我可以通过删除echo:s来做一个解决方法,但如果你想手动运行批处理文件,那么它不能很好地工作。

我做错了什么或者它是如何工作的?

+0

这个批处理文件与您的真实批处理文件有相同的问题吗? –

+0

你需要命令的输出吗?因为你必须在一段时间后消耗输出,否则过程会被阻塞。 –

+0

它与真正的批处理文件有相同的问题。我不需要这个脚本中的输出,但是如果你手动运行这个批处理文件就很有用。它启动一个不停止的程序,这就是为什么它需要在后台运行 – Meathook

回答

0

,因为我想在批处理文件在后台运行,我不希望它看起来像这样的输出工作:

subprocess.Popen("test.bat", shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) 

或Python的< 3.3

with open(os.devnull, 'w') as f: 
    subprocess.Popen("test.bat", shell=True, stdout=f, stderr=subprocess.STDOUT) 

让 - 弗朗索瓦法布尔帮助我,这可能是一个完整的缓冲区故障,如果我使用:

subprocess.call("test.bat", shell=True) 

它工作,但批处理文件有一个超时仍在运行,所以它不在后台运行,所以我猜DEVNULL无视所有输出,而不是缓冲区,所以它使工作。