我在 python 中生成一个子进程,如下所示:
proc = subprocess.Popen(
[process, arg1, arg2],
env= current_env, cwd=exec_path, stdout=subprocess.PIPE)
当我向子进程发送一个 SIGTERM (来自 shell,而不是 python)时,我的问题就出现了。
如果我proc.read()
用来读取proc
's stdout 的结果,那么我最终会陷入死锁(正如预期的那样,由于使用了 PIPE),但 python 不会崩溃。
但是,如果我使用proc.communicate()
python segfaults。据我了解,无论孩子做什么,这都不应该以任何方式影响父进程(python)!
我想做的是打电话proc.communicate()
,然后检查proc.returncode
哪个应该表明子进程有任何问题。
我正在使用 Python 2.7.3
谢谢!
编辑: 要注意的另一件事是,这是在 QThread (PySide.QtCore.QThread) 中运行的。
编辑2:
最小的例子:
该示例在 QThread 上下文之外正确运行,因此问题似乎与它有关。
进程.py:
class A(QThread):
def run(self):
pp = subprocess.Popen(["./loop.sh"], stdout=subprocess.PIPE)
output = pp.communicate()
print('Now send SIGTERM to loop.sh and watch me crash')
循环.sh
#!/bin/bash
while true; do : ; done