我在Raspberry Pi上使用开放式照明架构,我需要能够用一个按钮开始一个不断循环运行的节目,然后杀死那个节目,然后用一个按钮开始另一个节目。我使用的是有4个按钮的pyface插件。我可以启动一个进程,但是我不能用按钮杀死一个进程。
如果您在命令行中使用ola,则可以通过按control-c来停止显示。我已经能够用tkinter做一个可以停止进程的gui,但同样的过程不能用物理按钮来完成。
from time import sleep
import os
import signal
import piface.pfio as pfio
import time
import threading
from subprocess import Popen
import subprocess
import Queue
pfio.init()
pfio.digital_read(0)
pfio.digital_read(1)
pfio.digital_read(2)
def olaserverStart ():
os.system('olad -l 3')
def show1():
os.system('ola_recorder -p /home/pi/Mermaid -i 0')
def stop():
try:
sig = signal.CTRL_C_EVENT
except AttributeError:
sig = signal.SIGINT
send_signal(sig)
def universe():
global proc3
proc3 = subprocess.Popen('ola_patch -d 12 -p 0 -u 0', shell=True)
proc3.wait()
def universe1():
global proc4
proc4 = subprocess.Popen('ola_patch -d 6 -p 0 -u 0', shell=True)
proc4.wait()
olaserverStart()
universe()
universe1()
while True:
if (pfio.digital_read(0) == 1):
p3 = subprocess.Popen('ola_recorder -p /home/pi/Mermaid -i 0', shell=True)
p3.wait()
if (pfio.digital_read(1) == 1):
try:
sig = signal.CTRL_C_EVENT
except AttributeError:
sig = signal.SIGINT
p3.send_signal(sig)
if (pfio.digital_read(2) == 1):
os.system('ola_recorder -p /home/pi/Mermaid -i 0')
sleep(0.15);发布于 2014-03-14 17:22:43
当我使用send_signal时,它也不工作。我不知道why.So我试图使用os.kill来杀除子进程。
pp = subprocess.Popen("ping www.google.com",stdin = subprocess.PIPE,stdout = subprocess.PIPE,stderr = subprocess.PIPE,shell = True)
os.kill(pp.pid+1,signal.SIGTERM)发布于 2014-03-15 03:47:53
代码中的p3.wait()会阻止循环,直到子进程结束。如果你删除了它,那么你可以调用:
if p.poll() is None:
p.terminate()
p.wait()来终止进程。
os.system()也会一直阻塞,直到子进程结束。您可以将其替换为:
subprocess.Popen('ola_recorder -p /home/pi/Mermaid -i 0'.split())只要ola_recorder启动,它就会立即返回,而不需要等待它退出。
为了避免僵尸,你需要调用p.wait() (阻塞)或p.poll() (不阻塞)。您应该调用later,直到它返回非None值(表示子进程退出)。
发布于 2014-03-17 09:03:49
我又试了一次。它可以终止进程。当我这样做的时候
pp = subprocess.Popen("ping www.google.com", stdin=subprocess.PIPE, stdout= subprocess.PIPE,stderr = subprocess.PIPE,shell = True)它确实有两个过程。/bin/sh -c和ping。当我尝试terminate()时,它会杀死/bin/sh -c。因此ping命令仍在运行。
https://stackoverflow.com/questions/17737222
复制相似问题