Вопрос по процессам

dmitriy.chilikin

Новичок
Пользователь
Апр 14, 2020
4
2
3
Добрый день! Я запускаю скрипт на питоне в терминале(терминал1). В скрипте я использую subprocess.Popen и создаю новый терминал(терминал2), в котором происходит запуск процесса. Хотелось бы узнать, как получить информацию о pid процесса, который создается в терминале2 и передать его в терминал1 ? Подскажите, пожалуйста, как это можно сделать ?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Python:
 1.py
from subprocess import PIPE, run
import subprocess

if __name__ == '__main__':
    process = subprocess.Popen(["python3 2.py; "], shell=True)

2.py
from subprocess import PIPE, run
import subprocess

if __name__ == '__main__':
    process = subprocess.Popen(['ping 8.8.8.8'], shell=True)
    print(process.pid)
Я хочу узнать pid процесса, который будет выполнять команду ping. А у меня выводит pid консоли, которая открывается. Подскажите, пожалуйста, как узнать pid интересующего процесса?
Вот пример (первый процесс вызывает второй, второй открывает калькулятор):
Python:
# process1.py
import subprocess


def main():
    process1 = subprocess.Popen(['python', 'process2.py'])

    print('process1_id', process1.pid)

    exit_code = process1.wait()
    print('Процесс process1 завершился с кодом:', exit_code)


if __name__ == '__main__':
    main()

# process2.py
import subprocess


def main():
    process2 = subprocess.Popen(['calc'])
    print('process2_id', process2.pid)

    exit_code = process2.wait()
    print('Процесс process2 завершился с кодом:', exit_code)


if __name__ == '__main__':
    main()
 
  • Мне нравится
Реакции: Student

dmitriy.chilikin

Новичок
Пользователь
Апр 14, 2020
4
2
3
Вот пример (первый процесс вызывает второй, второй открывает калькулятор):
Python:
# process1.py
import subprocess


def main():
    process1 = subprocess.Popen(['python', 'process2.py'])

    print('process1_id', process1.pid)

    exit_code = process1.wait()
    print('Процесс process1 завершился с кодом:', exit_code)


if __name__ == '__main__':
    main()

# process2.py
import subprocess


def main():
    process2 = subprocess.Popen(['calc'])
    print('process2_id', process2.pid)

    exit_code = process2.wait()
    print('Процесс process2 завершился с кодом:', exit_code)


if __name__ == '__main__':
    main()
В данном примере, мы ждем конца выполнения данного процесса.
Python:
exit_code = process2.wait()
В моем случае, ситуация противоположная. Мне не нужно дожидаться выполения команды 2 процесса (ping 8.8.8.8). Т.к в Linux эта команда выполняется бесконечно. Я пытаюсь добиться,чтобы после запуска бесконечной команды ping 8.8.8.8, я получил его pid и когда мне понадобится его завершить, то я смог сделать команду kill pid полученного процесса.
 
Последнее редактирование:
  • Мне нравится
Реакции: Student

dmitriy.chilikin

Новичок
Пользователь
Апр 14, 2020
4
2
3
Слева в терминале вы видете pid, который вывелся после выполения команды popen (12679), а справа в другом терминаеле, вы можете увидеть, что процесс, выполняющий команду ping 8.8.8.8 имеет совершенно другой pid.( я его подчеркнул красным, 12681) Вот как получить pid 12681 ?
Безымянный.png
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Слева в терминале вы видете pid, который вывелся после выполения команды popen (12679), а справа в другом терминаеле, вы можете увидеть, что процесс, выполняющий команду ping 8.8.8.8 имеет совершенно другой pid.( я его подчеркнул красным, 12681) Вот как получить pid 12681 ?
Посмотреть вложение 86
В пример выше exit_code написал для наглядности - можно и без них. Вот пример:
Python:
# process1.py
import subprocess


def main():
    process1 = subprocess.Popen(['python', 'process2.py'])

    print('process1_id', process1.pid)

    
if __name__ == '__main__':
    main()
    
# process2.py
import subprocess


def main():
    process2 = subprocess.Popen(['python', 'infinite_while.py'])
    print('process2_id', process2.pid)

    
if __name__ == '__main__':
    main()
    
# infinity_while.py
from time import sleep
while True:
    print('1')
    sleep(1)
Это код выводит pid обоих процессов в консоль и делает бесконечный print(1). На windows работает.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Покажите код, которым создаете процесс или весь код если он небольшой.
 

dmitriy.chilikin

Новичок
Пользователь
Апр 14, 2020
4
2
3
Покажите код, которым создаете процесс или весь код если он небольшой.
Python:
 1.py
from subprocess import PIPE, run
import subprocess
 
if __name__ == '__main__':
    process = subprocess.Popen(["python3 2.py; "], shell=True)

 2.py
from subprocess import PIPE, run
import subprocess
 
if __name__ == '__main__':
    process = subprocess.Popen(['ping 8.8.8.8'], shell=True)
    print(process.pid)
Я хочу узнать pid процесса, который будет выполнять команду ping. А у меня выводит pid консоли, которая открывается. Подскажите, пожалуйста, как узнать pid интересующего процесса?
 

Roninon

Новичок
Пользователь
Апр 21, 2020
3
2
3
Украина
Можно записать вывод команды ping в переменную окружения (библиотека os в Python поможет получить доступ к значению переменной), или в txt файл, а затем в Python`e считать его.
 

Форум IT Специалистов