【发布时间】:2016-05-01 05:42:39
【问题描述】:
在运行 Jessie 的 Raspberry Pi 2 上,我有两个显示器,一个(默认)HDMI 显示器和一个 LCD 触摸屏(需要使用 os.environ 设置几个与 SDL 相关的变量)。
我有两个 pygame 程序,lcd.py 和 hdmi.py,当从单独的 SSH 终端运行时,它们可以很好地共存,lcd.py 显示几个按钮,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>
【问题讨论】:
-
您知道两者之间共享的内容是您不想要的吗?您提到环境变量,但子进程确实有自己的一组环境变量,它们只是被初始化为与我相信的父进程相同的值。如果问题是两者需要不同的 DISPLAY 值,那么 popen 将允许您使用 popen 构造函数的 env 参数指定备用值。您也可以尝试将孩子作为守护进程生成:stackoverflow.com/questions/5772873/…
-
使用 env= 有效,谢谢。如果您想将其添加为答案,我会接受。
-
关于不同
$DISPLAYs的问题与“好像它是从不同的SSH终端运行一样”(前者是关于envvars(通过env参数),后者大约是preexec_fn=os.setsid(也可能是other aspects that are usually common for daemons)
标签: python subprocess