Python 终止进程不终止子进程,也不关闭终端窗口

Python 终止进程不终止子进程,也不关闭终端窗口,python,subprocess,popen,gnome-terminal,Python,Subprocess,Popen,Gnome Terminal,我正在UBUNTU上工作,我有一个文件main.py,里面有一段代码: #!/usr/bin/env python3 # coding=utf-8 import os import time from subprocess import Popen, PIPE, call, signal base_path = os.path.abspath('') path_to_file = base_path + '/test_subprocess.py' p = Popen(['gnome-termi

我正在UBUNTU上工作,我有一个文件
main.py
,里面有一段代码:

#!/usr/bin/env python3
# coding=utf-8
import os
import time
from subprocess import Popen, PIPE, call, signal

base_path = os.path.abspath('')
path_to_file = base_path + '/test_subprocess.py'
p = Popen(['gnome-terminal', "--",  path_to_file])
time.sleep(2)

os.kill(p.pid, signal.SIGKILL)
我有
test\u subprocess.py
这样的代码:

#!/usr/bin/env python3
# coding=utf-8

import time

def print_message():
    while True:
        print('I am working!')
        time.sleep(0.5)
    
print_message()
我试图终止子进程,但之后

os.kill(p.pid, signal.SIGKILL)
子进程仍在工作,并打印
“我正在工作!”

如何完成子流程以及如何关闭gnome终端? 如果我选择了完全错误的方式。你能给我举个工作例子吗

新版本的
test_subprocess.py

#!/usr/bin/env python3
# coding=utf-8
import sys
from subprocess import signal
import time

def print_message():
    while True:
        print('I am working!')
        time.sleep(0.5)
        if signal.SIGKILL:  # it is braking a loop when parent process terminate!
            print('I am killing self!')
            break

print_message()

我应该像上面那样做吗?

您可以尝试以下方法:

p = Popen(['gnome-terminal', "--",  path_to_file])
PIDs = p.pid
os.system("kill {0}".format(PIDs))
pid子进程的进程ID

请注意,如果将shell参数设置为True,则这就是过程 生成的壳的ID

这至少会扼杀正确的进程。不确定它是否会关闭终端

编辑:要终止进程并关闭终端:

p = Popen(['gnome-terminal', '--disable-factory', '-e', path_to_file], preexec_fn=os.setpgrp)

os.killpg(p.pid, signal.SIGINT)
归功于,我为你的命令修改了:

  • --disable factory
    用于避免重新使用活动终端,以便我们可以通过子进程句柄终止新创建的终端
  • os.setpgrp
    将gnome终端放在自己的进程组中,以便
    os.killpg()
    可用于向该组发送信号

子进程的进程ID

请注意,如果将shell参数设置为True,则这就是过程 产卵壳的ID。


尝试将
Popen
构造函数的
shell
参数设置为
False
。(
p=Popen(['gnome-terminal',“--”,路径到文件])
->
p=Popen(['gnome-terminal',“--”,路径到文件],shell=False)
)。不久前,我遇到了一个类似的问题,这为我解决了。

test_subprocess.py中的signal.SIGKILL是否解决了我的问题?我已经检查过了,它正在关闭子进程。这就是我所需要的吗?请不要在问题中添加其他问题(和答案)。每个问题页都应该是关于一个问题的。更改/添加您的问题可能会使现有答案无效-请避免。如果你有新问题,你可以打招呼。我使用shell=False进行了测试,但对我没有帮助。当父程序完成时,子程序仍在工作。这:p=Popen(['gnome-terminal','-disable factory','-e',path_to_file],preexec_fn=os.setpgrp)os.killpg(p.pid,signal.SIGINT)正在为我工作。但如果在子进程中,您必须在结束之前做一些事情,该怎么办?例如,如果您有打开的文件,或者您必须在关闭程序之前保存您的工作?如何在VENV中将PYTHON脚本作为子进程运行?我在子进程的os.environ中找到了答案。若我在env中调用parent,则在env中调用child。