Я пытаюсь сделать лаунчер приложений, но он не работает, а другой подпроцесс работает. Я запускаю firefox, но остальные задачи завершаются только тогда, когда окно с firefox закрывается. ...

0
hickkey 15 Янв 2021 в 09:47

2 ответа

Лучший ответ

Вы можете создать поток, который запускает команду subprocess.call.

Дешевый трюк - заменить subprocess.call на subprocess.Popen

import subprocess
while True:
    app = input('>>> ')
    subprocess.Popen(app)

Ожидается, что вы назначите результат, чтобы вы могли прочитать вывод команды в виде потока (с правильными параметрами перенаправления, которых нет по умолчанию), но его также можно использовать как быстрый способ запускать что-то в фоновом режиме.

Как только вызывается Popen и запускается процесс, скрипт python возобновляется.

Предупреждение: если вы не сохраните дескриптор процесса, у вас нет дальнейшего контроля над приложением, и вы также не знаете, можно ли вообще запустить процесс. Сохранение дескриптора в словаре позволит вашей небольшой внутренней команде оболочки по желанию уничтожать эти процессы.

Чтобы убедиться, что процесс запущен, все же лучше использовать поток и вызвать subprocess.call в этом потоке (блокируя, но в потоке) и проверить код возврата.

1
Jean-François Fabre 15 Янв 2021 в 07:00

subprocess.call и subprocess.run ждут завершения. Если вам нужны асинхронные процессы, вам нужно использовать subprocess.Popen напрямую.

Пример из тестового примера, в котором проверяется связь между двумя процессами:

    sub_pro = Popen(tst_subscriber, stdout=subprocess.PIPE, env=test_env)
    pub_pro = Popen(tst_publisher, stdout=subprocess.PIPE, env=test_env)

    timeout_sub = Timer(timeout, kill_subscriber, [sub_pro])
    timeout_pub = Timer(timeout, kill_publisher, [pub_pro])

    timeout_sub.start()
    timeout_pub.start()
    (output, err) = sub_pro.communicate()
0
kutschkem 15 Янв 2021 в 07:02
65731623