Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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子进程?终止并杀死不工作的人_Python_Subprocess_Terminate_Execfile - Fatal编程技术网

如何停止正在运行单元测试的python子进程?终止并杀死不工作的人

如何停止正在运行单元测试的python子进程?终止并杀死不工作的人,python,subprocess,terminate,execfile,Python,Subprocess,Terminate,Execfile,我有一个Tkinter GUI运行两个线程,GUI的主线程和工作线程。工作线程使用以下代码创建子进程: myProcess = subprocess.Popen(['python', '-u', 'runTests.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 文件runTests.py执行一些设置,然后使用以下命令运行单元

我有一个Tkinter GUI运行两个线程,GUI的主线程和工作线程。工作线程使用以下代码创建子进程:

myProcess = subprocess.Popen(['python', '-u', 'runTests.py'],  
                         stdout=subprocess.PIPE, 
                         stderr=subprocess.STDOUT)
文件runTests.py执行一些设置,然后使用以下命令运行单元测试文件:

execfile('myUnitTests.py')
文件myUnitTests.py有几个单元测试,其中一些测试运行时间超过五分钟。 在GUI中,我单击一个按钮停止运行测试。这反过来会使工作线程发送停止子进程的信号:

myProcess.terminate()
terminate命令不会立即停止进程,它会等待当前单元测试完成运行,然后终止进程? 我曾尝试使用
os.kill
,但得到的结果与
terminate()
相同


您知道如何使程序更具响应性,从而立即终止子进程吗?

Python文档[]说:

  • 尽管就Python用户而言,Python信号处理程序是异步调用的,但它们只能在Python解释器的“原子”指令之间发生。这意味着,在纯用C实现的长时间计算过程中到达的信号(例如大型文本体上的正则表达式匹配)可能会延迟任意时间
因此,如果您的五分钟单元测试正在进行“一个纯用C实现的长计算”,并且您的单元测试工具为
SIGTERM
安装了一个处理程序,那么这就是您的问题所在。如果是,请尝试
myProcess.kill
而不是
myProcess.terminate
(或者,如果没有2.6,
myProcess.send\u信号(9)
SIGKILL
无法从用户空间进行修补,应立即生效

警告:任何应该在单元测试框架之外运行的清理操作都不会执行