Python与正在运行的进程交互

6

我有一个使用Python编写的脚本,可以通过简单的Web服务器(Flask)从手机与我的 Raspberry Pi 进行交互。

在这个脚本中,我可以调用 omxplayer 来播放媒体文件,我会使用以下命令来完成:

Popen(['omxplayer '+filePath], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)

这个功能已经很好了,但我希望能够通过发送键盘命令与此进程进行交互。当omxplayer正在运行时,您可以按空格键播放/暂停、箭头键快进/快退等。我想从我的Python脚本中以编程方式发送这些键盘输入,而不是要求人们手动按键。
我如何在使用Python打开omxplayer后从Python发送一个键盘命令给该进程呢?
另外,我如何从Python检测是否有另一个实例的omxplayer正在运行,而且它没有被当前Python脚本运行?例如,如果omxplayer被调用并且正在由ssh连接上的其他用户运行,我如何在Python脚本内检测到并在调用自己的omxplayer进程之前杀死该进程?

请查看psutils - smeso
所以你想要检测和终止正在被用户使用的进程?那似乎不太礼貌。 - Kevin
psutils可能很适合杀死进程,但我想做的主要是发送键盘输入到由脚本打开的进程。我知道杀掉别人正在做的事情是不礼貌的,但这是为了Rapsberry Pi,只能同时运行1个该程序实例,否则会导致系统崩溃,所以这是必要的。 - shiznatix
1个回答

6

看起来omxplayer正在从stdin读取 - 你可以使用你的命令向该进程的stdin写入数据。

from subprocess import Popen, PIPE
p = Popen(['omxplayer', filePath], stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
p.stdin.write(' ') # sends a space to the running process
p.stdin.flush() # if the above isn't enough, try adding a flush

编辑:要发送箭头键,请尝试在终端中按下Ctrl+v然后按下,以查看被发送的键码-它将是^[[Desc[D。您可以使用stream.write("\x1b[D")(或"^[[D",其中^[是由Ctrl+v esc生成的一个字符,等待半秒钟后)输入这个代码。


1
这个很好用,谢谢。不过你知道怎么发送箭头键到stdin.write()吗?比如左、上、下、右箭头键的按键。 - shiznatix
1
@shiznatix添加了如何在答案中编写箭头键。 - Thomas
1
非常好,谢谢!最后一个问题,有没有办法找出是否已经有一个omxplayer进程正在运行(这部分已经解决了),如果是的话,是否可以向该进程发送键盘命令(即使Python进程没有生成原始的omxplayer进程)? - shiznatix
1
不像其他的那么容易 - 你需要以某种方式启动omxplayer进程,使其侦听标准输入上的内容,以便你可以发送命令。 - Thomas
@Thomas,flush 如何帮助立即发送命令给进程? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接