Как запустить подпроцесс в фоновом режиме и остановить его нажатием клавиши?

Я работаю в Windows 10, использую Python 3.7 и хочу запустить подпроцесс для чтения видео и остановить его, если пользователь касается клавиатуры (я использую модуль keyboard из https://pypi.org/project /клавиатура):

import subprocess
import keyboard

p1 = subprocess.call(keyboard.record(until='enter'))
p2 = subprocess.call([vlc, url_video, "vlc://quit", "&", "exit 0"])
while True:
    if p1.poll():
        p2.terminate()
        break
    if p2.poll() == None:
        break

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

Вам придется использовать многопоточность

Alfie 13.12.2020 15:57
asyncio должен вам помочь.
Akihito KIRISAKI 13.12.2020 15:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
222
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом коде есть как минимум две проблемы:

  • subprocess.call(keyboard.record(until='enter')) сначала вызывает keyboard.record, который блокируется до возврата, а затем вызывает subprocess.call с возвращаемым значением keyboard.record в качестве аргумента (что само по себе не имеет смысла).

  • subprocess.call также блокируется до тех пор, пока не завершится запущенный подпроцесс (помимо того, что он не делает то, что вы хотите здесь, он еще и устарел с Python 3.5.). Мы можем использовать subprocess.Popen для запуска подпроцесса в фоновом режиме.

Вы неэффективно используете API клавиатуры . Вы не хотите записывать нажатия клавиш во время записи видео, вы хотите запускать действие при нажатии определенной клавиши. Для этого вроде бы подходит функция on_press_key.

Он принимает функцию (обратный вызов), которая будет выполняться после нажатия определенной клавиши. Мы можем передать функцию, которая завершит запущенный нами подпроцесс.

Насколько я могу судить, это должно работать:

import subprocess
import keyboard

# I haven't checked if these arguments are correct, they are unchanged
p = subprocess.Popen([vlc, url_video, "vlc://quit", "&", "exit 0"])

# set up callback to kill vlc if key is pressed
def stop_vlc(event):
    if p.poll() is not None:
        return  # already done, do nothing
    p.terminate()

keyboard.on_press_key('enter', stop_vlc)

# wait until vlc finishes, either by itself or because it is killed
p.wait()

Другие вопросы по теме