我在使用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
。所以我永远不会进入无限循环。
此代码至少存在两个问题:
subprocess.call(keyboard.record(until='enter'))
首先调用keyboard.record
,直到它返回该块,然后调用subprocess.call
与返回值keyboard.record
作为参数(这是没有意义的本身)。
subprocess.call
也会阻塞,直到启动的子进程完成为止(除了未在此处执行您想要的操作之外,自Python 3.5开始,它也已过时。)。我们可以用来subprocess.Popen
在后台启动子流程。
您没有有效使用keyboard
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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句