更新2:所以我用管道传输了stderr的输出,当我包含shell=True时,我就得到了omxplayer的帮助文件(它列出了所有的命令行开关等等)。shell=True可能不能很好地与omxplayer配合使用吗?在
更新:我以前遇到过这个链接,但在我身上失败了,所以我没有深入挖掘就继续前进。在齐邦再次提出这个建议后,我进一步研究了一下。我有两个问题,我希望第一个问题是由第二个问题引起的。第一个问题是,当我将shell=True作为一个参数时,该视频永远不会播放。如果我不包括它,视频播放,但从未被杀死。更新了下面的代码。在
所以我尝试为我的raspberry pi编写一个python应用程序,在循环中播放一个视频(我发现Popen是使用OMXplayer实现这一点的一个好方法),然后在键盘中断时,它会终止该进程并打开另一个进程(播放另一个视频)。我的最终目标是能够使用vid1作为一种“屏幕保护程序”,并在用户与系统交互时播放vid2,但目前我只是想在键盘输入上杀死vid1,而这却遇到了相当困难的时刻。我希望有人能告诉我我的代码在哪里掉下来了。在
预先警告我对Python和基于linux的系统非常陌生,所以如果我做错了这件事,请随时为我重新定向,但这似乎是最快的方法。在
以下是我的代码:
import subprocess
import os
import signal
vid1 = ['omxplayer', '--loop', '/home/pi/Vids/2779832.mp4']
while True:
#vid = subprocess.Popen(['omxplayer', '--loop', '/home/pi/Vids/2779832.mp4'], stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
vid = subprocess.Popen(vid1, stdout=subprocess.PIPE, preexec_fn=os.setsid)
print 'SID is: ', preexec_fn
#vid = subprocess.Popen(['omxplayer', '--loop', '/home/pi/Vids/2779832.mp4'])
id = raw_input()
if not id:
break
os.killpg(vid.pid, signal.SIGTERM)
print "your input: ", id
print "While loop has exited"
默认情况下,
SIGINT
将传播到前台进程组中的所有进程,请参见"How Ctrl+C works"。^如果你不想使用cd4{cd4}>进程,你就不需要使用它。在“键盘中断”(sigint signal)在Python中显示为
KeyboardInterrupt
异常。你的代码应该捕捉到它:上面假设
omxplayer
存在于Ctrl+C
。在您可以看到帮助消息,原因有很多,例如。,
omxplayer
不支持loop
选项(手动运行以检查)或您错误地使用了shell=True
和将命令作为列表传递:如果您需要shell=True
,则始终将命令作为单个字符串传递,反之:always(在POSIX上)如果shell=False
(默认),则将命令作为参数列表传递。在相关问题 更多 >
编程相关推荐