Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.PIPE阻止可执行文件关闭_Python_Python 2.7_Subprocess - Fatal编程技术网

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())