如何在后台启动子流程并按键停止?

2024-05-28 20:24:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Windows 10上,使用Python 3.7,希望启动一个子进程来读取视频,并在用户触摸键盘时停止它(我正在使用来自https://pypi.org/project/keyboardkeyboard模块):

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


Tags: 用户import视频if进程windows键盘call
1条回答
网友
1楼 · 发布于 2024-05-28 20:24:25

此代码至少有两个问题:

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

  • ^{}也会一直阻塞,直到启动的子进程完成(除了不做您想做的事情之外,它也已经过时,因为Python 3.5)。我们可以使用subprocess.Popen后台中启动子流程

您没有有效地使用^{} API。如果不希望在视频录制运行时record击键,则希望在按下特定键时触发动作。为此,^{}函数似乎是合适的

它使用一个函数(回调函数),该函数将在按下特定键后执行。我们可以传递一个函数,该函数将终止我们启动的子进程

据我所知,这应该是可行的:

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()

相关问题 更多 >

    热门问题