Python subprocess.PIPE阻止可执行文件关闭
为什么Python subprocess.PIPE阻止可执行文件关闭,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,为什么subprocess.PIPE会阻止被调用的可执行文件关闭 我使用以下脚本调用具有多个输入的可执行文件: import subprocess, time CREATE_NO_WINDOW = 0x08000000 my_proc = subprocess.Popen("myApp.exe " + ' '.join([str(input1), str(input2), str(input3)]), startupi
subprocess.PIPE
会阻止被调用的可执行文件关闭
我使用以下脚本调用具有多个输入的可执行文件:
import subprocess, time
CREATE_NO_WINDOW = 0x08000000
my_proc = subprocess.Popen("myApp.exe " + ' '.join([str(input1), str(input2), str(input3)]),
startupinfo=subprocess.STARTUPINFO(), stdout=subprocess.PIPE,
creationflags = CREATE_NO_WINDOW)
然后我监视应用程序是否在给定的时间(300秒)内完成,如果没有,我就杀死它。我还阅读了应用程序的输出,以了解它是否未能完成所需的任务
proc_wait_time = 300
start_time = time.time()
sol_status = 'Fail'
while time.time() - start_time < proc_wait_time:
if (my_proc.poll() is None):
time.sleep(1)
else:
try:
sol_status = my_proc.stdout.read().replace('\r\n \r\n','')
break
except:
sol_status = 'Fail'
break
else:
try: my_proc.kill()
except: None
sol_status = 'Frozen'
if sol_status in ['Fail', 'Frozen']:
print ('Failed running my_proc')
proc\u wait\u time=300
开始时间=time.time()
sol_状态=‘失败’
while time.time()-开始时间
正如您从代码中注意到的,我需要等待myApp.exe
完成,但是,有时myApp.exe
会冻结。因为上面的脚本是循环的一部分,所以我需要识别这种情况(通过计时器),跟踪它并杀死myApp.exe
,这样整个脚本就不会卡住
现在的问题是,如果我使用subprocess.PIPE
(如果我想读取应用程序的输出,我想我必须这样做),那么myApp.exe
在完成后不会关闭,因此my_proc.poll()为None
总是正确的
我使用的是Python2.7。在写入
子流程.pipe
的大量数据的情况下,存在管道缓冲区限制/错误。修复此问题的最简单方法是将数据直接导入文件:
_stdoutHandler = open('C:/somePath/stdout.log', 'w')
_stderrHandler = open('C:/somePath/stderr.log', 'w')
my_proc = subprocess.Popen(
"myApp.exe " + ' '.join([str(input1), str(input2), str(input3)]),
stdout=_stdoutHandler,
stderr=_stderrHandler,
startupinfo=subprocess.STARTUPINFO(),
creationflags=CREATE_NO_WINDOW
)
...
_stdoutHandler.close()
_stderrHandler.close()
当你关闭应用程序时,你是否正在关闭管道?不,这都是关于
my_proc
我如何才能明确关闭管道的问题?我需要在kill()
之后立即执行吗?我一直认为这是集成在kill
中的。另外,这如何解决my_proc.poll()的问题始终是None
是真的?如果您没有从管道中读取数据,并且进程向其中写入了超过一个缓冲区(可能是4K)的数据,那么它将阻塞,直到一些缓冲区空间可用为止-这永远不会发生。@jasonharper那么解决方法是stdout.read吗()
每隔一段时间合并一次并在最后合并它?@Mosy:stderr中有什么东西吗?返回代码如何?如果使用subprocess.Popen(taskkill/F/T/PID%i'%my_proc.PID)
而不是my_proc.kill()
将stdout直接导入一个文件:subprocess.Popen(“myApp.exe,…,stdout=open(“C:/temp/whatever.log”,“w”).open())