波彭。杀了()失败

2024-06-29 00:59:47 发布

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

更新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"

Tags: 代码importlooptruehome视频ospi
1条回答
网友
1楼 · 发布于 2024-06-29 00:59:47

So I am trying to write a python app for my raspberry pi that plays a video on a loop (I came across Popen as a good way to accomplish this using OMXplayer) and then on keyboard interrupt, it kills that process and opens another process (playing a different video).

默认情况下,SIGINT将传播到前台进程组中的所有进程,请参见"How Ctrl+C works"。^如果你不想使用cd4{cd4}>进程,你就不需要使用它。在

“键盘中断”(sigint signal)在Python中显示为KeyboardInterrupt异常。你的代码应该捕捉到它:

#!/usr/bin/env python
from subprocess import call, check_call

try:
   rc = call(['omxplayer', 'first file'])
except KeyboardInterrupt:
   check_call(['omxplayer', 'second file'])
else:
   if rc != 0:
      raise RuntimeError('omxplayer failed to play the first file, '
                         'return code: %d' % rc)

上面假设omxplayer存在于Ctrl+C。在

您可以看到帮助消息,原因有很多,例如。,omxplayer不支持 loop选项(手动运行以检查)您错误地使用了shell=True将命令作为列表传递:如果您需要shell=True,则始终将命令作为单个字符串传递,反之:always(在POSIX上)如果shell=False(默认),则将命令作为参数列表传递。在

相关问题 更多 >