python - 杀死进程不要杀死子进程并且不要关闭终端窗口
问题描述
我正在研究 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_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)
子进程仍在工作并打印'I am working!'
如何完成子进程以及如何关闭 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))
Popen.pid 子进程的进程 ID。
请注意,如果您将 shell 参数设置为 True,则这是生成的 shell 的进程 ID。
http://docs.python.org/library/subprocess.html
这至少会杀死正确的进程。不确定它是否会关闭终端。
编辑:终止进程并关闭终端:
p = Popen(['gnome-terminal', '--disable-factory', '-e', path_to_file], preexec_fn=os.setpgrp)
os.killpg(p.pid, signal.SIGINT)
归功于https://stackoverflow.com/a/34690644/15793575,我为您的命令进行了修改:
--disable-factory
用于避免重复使用活动终端,以便我们可以通过子进程句柄杀死新创建的终端os.setpgrp
将 gnome-terminal 放在自己的进程组中,以便os.killpg()
可以用来向该组发送信号
推荐阅读
- android - 单击工具栏上的菜单项不适用于 Navigationview
- r - 在 R Shiny 中使用 sql 查询时如何指定引号
- sql - 尝试使用 with 语句提取唯一值
- python - 使用数字和非数字变量的 imputer 从 numpy 更改为 pandas 时保留列名
- c# - 在 C# 中使用 API 发布
- reactjs - 尝试导入错误:“useControlled”未从“@material-ui/core/utils”导出
- java - 如何使用 thymeleaf 以一种形式显示来自 2 个实体的值
- python - 如何根据用户回答在 Streamlit 中显示代码?
- python - 使用 python 3.6 在 mac 上安装 mysqlclient 时出错
- arrays - 为具有 JSON 数组值的 jsonb 列创建 Postgres 索引