process.pid в python дает неверное значение в macOS mojave - PullRequest
0 голосов
/ 03 мая 2019

Я пробовал по крайней мере дюжину различных сценариев Python, чтобы уничтожить дочерний процесс, представленный здесь на SO, включая

this и this

но я очень расстроен.

вот этот питон:

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)

Идентификатор процесса печатается в терминале, запускается предварительный просмотр и открывается изображение, идентификатор процесса печатается снова, питонзаканчивается, и я снова в командной строке - но предварительный просмотр и изображение все еще открыты.Когда я проверяю идентификатор процесса в «Activity Monitor», оказывается, что фактический идентификатор процесса preview.app на единицу больше, чем значение process.pid.

Я должен изменить последнюю строку на эту:

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

и все работает.Почему ????

1 Ответ

1 голос
/ 03 мая 2019

Простое выполнение 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 в процессе b с использованием grep.
Мы даем стандартный вывод a для stin из b, а затем стандартный вывод b до output.
Нам нужно декодировать output в utf-8, потому что он возвращается в байтах, а нам нужно в строке.

print(output)

Дает нам следующий результат:

[' 7990  1520 eog /home/rahul/stroke.png', ' 8004  7980 grep stroke.png', '']

Итак, нам нужно число 7990, которое является истинным pid нашего stroke.png.
. Это делается с помощью int(pid.join(list(output[0])[1:5])), который дает нам числа от позиции 1 до позиции 4 в нашей строке, которая находится в позиции 0 вперечислим output, затем мы join() их и завернем их в int, потому что для уничтожения pid нам нужно целое число.
Вывод моей программы:

rahul@RNA-HP:~$ python3 so5.py
7982
7982
7990

Здесь 7982 был pid нашего подпроцесса, а 7990 - pid нашего stroke.png
Надеюсь, это поможет
Комментарийесли что-нибудь можно улучшить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...