python中的process.pid在macOS mojave上给出了错误的值

python中的process.pid在macOS mojave上给出了错误的值,python,macos,subprocess,Python,Macos,Subprocess,我已经尝试了至少十几种不同的python脚本来杀死本文中介绍的一个子进程 及 但是我非常沮丧 下面是python: import subprocess, os import time,signal,psutil process = subprocess.Popen(['open', '/Applications/Preview.app', 'images/conv1.jpg'], shell=False) print (process.pid) time.sleep(2) print (proc

我已经尝试了至少十几种不同的python脚本来杀死本文中介绍的一个子进程

但是我非常沮丧

下面是python:

import subprocess, os
import time,signal,psutil
process = subprocess.Popen(['open', '/Applications/Preview.app', 'images/conv1.jpg'], shell=False)
print (process.pid)
time.sleep(2)
print (process.pid)
os.kill(process.pid, signal.SIGKILL)
进程id打印在终端中,预览开始并打开一个图像,进程id再次打印,python终止,我返回shell提示符,但预览和图像仍然打开。当我在“活动监视器”中检查流程id时,发现preview.app的实际流程id比值process.pid大一个

我必须将最后一行更改为:

os.kill(process.pid+1, signal.SIGKILL)

它是有效的。为什么???

简单地执行
process.pid+1
不会杀死该进程,只是碰巧在那一刻,您的孩子从其父进程分叉,而没有其他进程启动。
您的
process.pid
不是图像的实际pid
conv1.jpg
。因此我们需要找到它的真实pid:

import subprocess
import os
import time
import signal
process = subprocess.Popen(['xdg-open', 'stroke.png'])#I have linux machine and stroke.png is a file which I need to open.
print(process.pid)
time.sleep(5)
print(process.pid)
a = subprocess.Popen(['ps', '-eo', 'pid,ppid,command'], stdout = subprocess.PIPE)
b = subprocess.Popen(['grep', 'stroke.png'], stdin = a.stdout, stdout = subprocess.PIPE)

output, error  = b.communicate()
output = output.decode("utf-8").split('\n')
pid = ''
pid = int(pid.join(list(output[0])[1:5]))
print(pid)
os.kill(pid, signal.SIGKILL)
这里我们要做的是采用两个过程
a
b

a
给出了所有pid,因此我们需要过滤掉文件中的pid,在我的例子中
stroke.png
正在使用grep
b

我们将
a
的stdout赋给
b
的stin,然后将b的stdout赋给
输出

我们需要将
输出
解码为utf-8,因为它返回字节,我们需要字符串

print(output)
给出了以下结果:

[' 7990  1520 eog /home/rahul/stroke.png', ' 8004  7980 grep stroke.png', '']
因此,我们需要编号
7990
,这是我们的
stroke.png

这是通过使用
int(pid.join(list(output[0])[1:5])
来实现的,它给出了字符串中从位置1到位置4的数字,该字符串在list
output
中位于位置0,然后我们
join()
将它们封装在
int
中,因为要杀死pid,我们需要一个整数。
我的程序给出的输出是:

rahul@RNA-HP:~$ python3 so5.py
7982
7982
7990
这里
7982
是我们子流程的pid,
7990
是我们的
stroke.png

希望能有所帮助

注释是否可以改进。

如果我去掉最后一行,以便预览不会终止,并注释掉时间。sleep(2),则实际进程id比打印的值大5。这是什么怪事?你确定它不是由别的东西发动的吗?另外,您的第一个链接是使用
os.killpg
,而不是
os.kill
。我认为对于macOS用户来说,它是
-Ao
,而不是
-eo
,用于列出进程。快速补充说明(我知道您是从OP复制的):使用SIGKILL来指示进程终止几乎是不合理的。当一个进程在收到SIGTERM后拒绝退出时,SIGKILL将用作最后手段。SIGKILL是立即终止的命令;接收进程无法执行干净关机的例程(例如关闭连接、完成挂起的事务、保存未保存的数据)。因此,它可能会导致数据损坏。最好发送SIGTERM。是的,我通常使用-9,这是SIGTERM,也适用于此类流程。谢谢你指出。呃,不:)9是SIGKILL<代码>终止
在以下情况下发送SIGTERM(15)。一份信号号码的清单。我一定又被弄糊涂了。谢谢。