2016-06-10 3 views
1

У меня есть программа python, которая создаст и выполнит другой скрипт python в новом терминале. Для этого я использую subprocess.Popen. Я пытаюсь получить PID нового процесса, используя .pid. Однако значение этого pid не похоже на реальный pid вновь созданного процесса (эти два значения не совпадают).Получить статус процесса python, который был выполнен в другом терминале

Вот пример моего кода:

from subprocess import Popen 

p = Popen("gnome-terminal -e 'python'",shell = True) 
print p.pid 

В недавно открывшемся терминале, я стараюсь, чтобы получить идентификатор процесса с помощью:

import os 
print os.getpid() 

Я получаю два разных значения. Кто-нибудь знает, как получить правильный pid? Мне нужно это знать, когда второй процесс был завершен, чтобы выполнить действие в первом процессе.

Благодарим за помощь!

Если вам нужно больше информации, пожалуйста, дайте мне знать :)

ответ

0

Однако значение этого PID, кажется, не соответствует реальной PID вновь созданного процесса (оба значения не совпадают).

Есть три процесса здесь: shell=True вызывает /bin/sh для запуска, которая работает gnome-terminal, который работает python (возможно, косвенно). gnome-terminal может быть только стартовой программой, которая делегирует python запущенному серверному процессу и завершает работу.

shell=False здесь не поможет. Вы получите gnome-terminal pid вместо /bin/sh-вы не получите python process 'pid.

Вы можете написать pid в известном файле или передать его через pipe/socket.

+0

Это правда! Я сделал то, что написал pid нового процесса в текстовом файле, а затем открыл этот файл в старом процессе для контроля состояния созданного терминала. Это немного сложно, но, по крайней мере, это работает. Как я могу это сделать через pipe/socket? Это проще? –

+0

@Eliekhalifeh: что использовать зависит от вашего прецедента. Если для вас работает простой текстовый файл (например, нет риска одновременного доступа, когда два или более процесса python перезаписывают его до того, как ваши родительские скрипты python могут прочитать соответствующие pids), затем используйте его. Код для именованного канала выглядит почти так же, но данные не записываются на диск (и поэтому pid не будет доступен, если ваш родительский скрипт python умрет после его чтения). Сокеты Unix позволяют обмениваться обоими способами (родительский <-> сценарии для дочерних питонов). Сокеты tcp/udp позволяют осуществлять связь между различными машинами (например, через Интернет). – jfs

+0

@ j-f-sebastian Кажется сложнее! Текстовый файл, который я создаю, будет удален после того, как родитель умрет, поэтому на диске не будут храниться файлы.У вас есть связь, где я могу видеть, как можно использовать сокеты UNIX? Спасибо! Я приму ваш ответ, потому что он более полезен, чем другой! –

0

Согласно documentation.

Если вы установили аргумент оболочки True, это идентификатор процесса порожденной оболочки.

Таким образом, вы будете нуждаться в shell=False

+0

Есть ли способ сделать это с помощью shell = True? –

+0

Хорошо, спасибо! Я приму свой ответ, потому что он решил проблему! –

+0

Я просто попробовал. Кажется, это не работает с shell = False! –

Смежные вопросы