Python kill批处理文件进程失败

时间:2017-07-18 09:07:52

标签: python windows batch-file subprocess

我正在尝试使用Python subprocess.Popen来运行批处理文件,该文件执行 xfoil.exe 并为其提供一些参数。然后等待直到xfoil.exe退出。

我使用以下代码作为批处理运行程序,它等待进程以超时退出。如果超时,该过程将被终止。

def Bat_Runner(args, **kwargs):
    """
    Batch runner
    :param args:
    :return:
    """
    si = STARTUPINFO()
    si.dwFlags |= STARTF_USESHOWWINDOW
    process = Popen(args, stdin=PIPE, stdout=DEVNULL, bufsize=1, universal_newlines=True)
    try:
        process.wait(kwargs['timeout'])
    except KeyError:
        process.wait()
    except TimeoutExpired:
        process.kill()
        raise TimeoutError

但是,有时 xfoil.exe 会失败并挂起,在这种情况下,批处理文件也会挂起,主程序会卡在process.wait(kwargs['timeout])。即使达到时间限制,批处理也不会被终止。在这种情况下,如果我通过双击“XXX.bat”手动运行批处理文件,控制台窗口也会挂起。

这是什么原因?我对此有点疑惑,因为Bat_Runner函数已经过测试,在某些情况下可以很好地杀死进程,但不是这种情况。

此外,如果kill()正在终止批处理过程,是否有办法终止它调用的 xfoil.exe 进程?

=========================更新行==================== ===========

PS:

1此代码将调用此 Bat_Runner 函数:

def _solve_by_Xfoil(self, alpha_set, Mach_number, Raynolds_number, parameter, is_viscus=True, **kwargs):
    ...many unrelated codes...
    try:
        if kwargs.get('timeout'):
            Bat_Runner(batch_file__bat, timout=kwargs['timeout'])
        else:
            Bat_Runner(batch_file__bat, timeout=5)
    except TimeoutError:
        print(''.join((Print_Colors.FAIL, 'Warning!\n', Print_Colors.ENDC,
               'Current Airfoil {} Cannot get an Output: {}!')).format(self._name, parameter))  

代码相对较大,所以为了简化,我只是展示了什么是重要的。理论上它会打印出一个失败的信息。 _solve_by_Xfoil 将通过以下方式调用:

cl_str_list = self._solve_by_Xfoil(alpha_range, Mach_number, Raynolds_number, 'CL', is_viscus=is_viscus,timeout=10, **kwargs)  

batch_file__bat(与XXX.bat相同)是一个包含以下内容的文件:

  

xfoil.exe< xfoil_batch_pid_11028.dat

2对于参考 xfoil.exe 是这个opensource program,在这种情况下我使用它的excutable exe文件,它会显示一个控制台窗口,只需键入一些指令使其运行,所以我使用批处理文件来运行它。

3当 xfoil.exe 失败并且挂起时,双击批处理文件 XXX.bat ,cmd窗口将保持并显示以下内容: enter image description here
如果 xfoil.exe 成功运行,批处理文件将自动运行并消失。

4我很确定批处理文件没有被删除,因为当我mannualy删除 xfoil_batch_pid_11028.dat 时,它会提供给 xfoil.exe < / strong>当它失败时,会显示一条消息,表明操作无法完成,因为此文件已被windos cmd打开。

0 个答案:

没有答案