python - python 程序如何运行另一个 python 程序,就好像它是从单独的 SSH 终端运行一样?

标签 python subprocess

在运行 Jessie 的 Raspberry Pi 2 上,我有两个显示器,一个(默认)HDMI 显示器和一个 LCD 触摸屏(这需要使用 os.environ 设置几个与 SDL 相关的变量)。

我有两个 pygame 程序,lcd.py 和 hdmi.py,当从不同的 SSH 终端运行时,它们可以很好地共存,lcd.py dsi 播放几个按钮,hdmi.py 在连接的 HDMI 显示器上显示幻灯片。

如果我在两个 SSH 终端中分别运行它们(作为“pi”用户,使用 sudo python PROGRAM),lcd.py 显示到 LCD,hdmi.py 显示幻灯片HDMI 屏幕。

但是,我不知道如何让 lcd.py 作为一个完全独立的进程调用 hdmi.py 程序(因此它有自己的环境变量,并且可以独立于驱动 LCD 显示器的父进程来驱动 HDMI 显示器).

lcd.py 程序有一个按钮,触摸时会调用例程 startSlideShow()

但是,我在 lcd.py startSlideShow() 中尝试启动 hdmi.py 的各种操作都失败了:

def startSlideShow():
   # when running in SSH the correct command is 
   #     sudo python /home/pi/Desktop/code/hdmi.py
   # or  sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py
   # tried various ways of invoking hdmi.py via
   # os.fork(), os.spawnl(), subprocess.Popen()
   WHAT GOES HERE?

不需要正在进行的进程间通信。除了 lcd.py 程序需要“启动”hdmi.py 程序时,它们不需要通信,而且实际上并不终止 lcd 是否终止 hdmi.py 程序对我来说很重要。

我在 startSlideShow() 中尝试过的工作:

cmd = "sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py"
pid = os.spawnl(os.P_NOWAIT, cmd)
# lcd.py keeps running, but creates a zombie process [python]<defunct>  instead of running hdmi.py

cmd = "sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py"
pid = os.spawnl(os.P_DETACH, cmd)
# lcd.py exits with error AttributeError: 'module' object has no attribute 'P_DETACH'

cmd = "sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py"
pid = os.spawnl(os.P_WAIT, cmd)
# no error message, returns a pid of 127, but does nothing, and no such process exists when I run `ps aux` in another SSH terminal

cmd = ["/usr/bin/python", "/home/pi/Desktop/code/hdmi.py" ]
pid = subprocess.Popen(cmd, stdout=subprocess.PIPE).pid # call subprocess
# runs the hdmi.py program, but output goes to LCD not HDMI 
# (the 2 programs alternately take over the same screen) 

cmd = ["/usr/bin/python", "/home/pi/Desktop/code/hdmi.py" ]
pid = subprocess.Popen(cmd).pid
# as above, both programs run on same display, which flashes between the two programs

pid = os.spawnlp(os.P_NOWAIT, "/usr/bin/python",  "/home/pi/Desktop/code/hdmi.py")
# invokes python interpreter, get >>> on SSH terminal

pid = os.spawnlp(os.P_NOWAIT, "/usr/bin/python /home/pi/Desktop/code/hdmi.py")
# creates zombie process [python] <defunct>

最佳答案

为了给子进程一个不同于父进程的环境变量值,您可以使用 env 参数给 POpen 构造函数并提供您想要的值。例如,这应该允许您提供不同的 DISPLAY 值。

关于python - python 程序如何运行另一个 python 程序,就好像它是从单独的 SSH 终端运行一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34983716/

相关文章:

Java 应用程序 : Execute Batch File with subprocess/UNC Path

python - Selenium webdriver python,无法按值找到?

python - Pandas DataFrame 构造函数接受列表输入?

python - 如何等待页面自动滚动完成

python - 当子进程输出满足条件时杀死子进程?

python - python子进程中的线程行为很奇怪

python - 如何在不使用 subprocess 或 pexpect 模块的情况下将输入值发送到终端

python - 将 python Dataframe 转换为 Matlab 文件

python - 我可以在 Python 中将打开的 gzip 文件与 Popen 一起使用吗?

python - 从 python 运行命令行来生成条形码