【问题标题】:Python interact with running processPython与正在运行的进程交互
【发布时间】:2015-08-04 05:20:32
【问题描述】:

我有一个 python 脚本,它允许我使用简单的网络服务器 (Flask) 从我的手机与我的 Rapsberry Pi 进行交互。

在这个脚本中,我可以调用 omxplayer 来播放媒体文件,我通过这样的命令来做到这一点:

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

这工作正常,但我希望能够通过发送关键命令与此过程进行交互。当 omxplayer 运行时,您可以按空格键播放/暂停,箭头键向前/向后跳等。我想从我的 python 脚本以编程方式发送这些键盘输入,而不是要求一个人在键盘上手动按下它们。

在用 Python 打开后,如何从 Python 向该进程发送按键命令?

另外,如果有另一个正在运行的 omxplayer 实例 not 目前正在从此 Python 脚本运行,我如何从 Python 中检测到?例如,如果 omxplayer 被调用并从某人通过 ssh 连接运行,我如何在 python 脚本中检测到这一点并在调用我自己的 omxplayer 进程之前终止该进程?

【问题讨论】:

  • 看看psutils
  • 所以你想检测并杀死正在被用户使用的正在运行的进程?这似乎不礼貌。
  • psutils 可能有助于终止进程,但我想做的主要事情是将键盘输入发送到脚本打开的进程。我知道杀死其他人正在做的事情是不礼貌的,但它对于 Rapsberry Pi 并且一次只能运行该程序的 1 个实例而不会导致一切崩溃,所以这是必要的。

标签: python linux


【解决方案1】:

听起来 omxplayer 正在从标准输入读取 - 您可能可以使用您的命令写入该进程的标准输入。

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,然后在终端中尝试 以查看正在发送的键码 -它将是^[[D,或 esc[D。您可以使用stream.write("\x1b[D")(或"^[[D",其中^[ 是由Ctrl+v esc 和等待半秒)。

【讨论】:

  • 这很好用,谢谢。您是否碰巧知道如何将箭头键发送到 stdin.write()?像,左,上,下,右箭头键按下。
  • @shiznatix 添加了如何编写箭头键来回答。
  • 太好了,谢谢!最后一个问题,有没有办法找到是否已经有 omxplayer 进程正在运行(该部分已经解决),如果是,则将键盘命令发送到该进程(即使 python 进程没有产生原始 omxplayer 进程) ?
  • 几乎没有那么容易 - 您需要启动 omxplayer 进程,以便它监听标准输入上的某些内容,您可以向其发送命令。
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多