如何在后台启动子进程并通过按键将其停止?

罗曼·茹恩(Romain Jouin)

我在使用Python 3.7的Windows 10上,并且想要启动一个子进程来读取视频并在用户触摸键盘时将其停止(我正在使用https://pypi.org/project/keyboard中keyboard模块) :

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所以我永远不会进入无限循环。

mkrieger1

此代码至少存在两个问题:

  • subprocess.call(keyboard.record(until='enter'))首先调用keyboard.record,直到它返回该块,然后调用subprocess.call与返回值keyboard.record作为参数(这是没有意义的本身)。

  • subprocess.call也会阻塞,直到启动的子进程完成为止(除了未在此处执行您想要的操作之外,自Python 3.5开始,它也已过时。)。我们可以用来subprocess.Popen后台启动子流程

您没有有效使用keyboardAPI你不想录制的视频录制运行时,按键,要触发一个动作,如果一个特定的键被按下。为此,该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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章