如何使用外部变量中断和停止正在运行的进程

2024-04-26 12:43:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python和一般代码都很陌生,所以请接受我的建议。你知道吗

我有一段代码可以运行并播放文件列表(就像在itunes播放列表上一样)。我需要通过切换从touchosc发送的按钮/变量来停止和重新启动循环。你知道吗

循环将触发并正常运行,但我无法在不按ctrl-c的情况下使其停止。问题似乎是,当循环运行时,我的程序不会用新值更新“loop”变量,以便在它更改为0时停止进程。我尝试了很多不同的方法,但都失败了。其中包括循环和线程(在我头上的方式)。如果有人能给我指出正确的方向,我将不胜感激!另外,请原谅我的黑客代码——r、s、sp和sr标志主要用于正在工作的程序的另一部分,因此我可以确保在录制或触发不同的播放文件时终止进程,以避免cpu过载,并且如果要同时录制到同一个文件并从中播放,也可以避免反馈。如果你有关于如何让这更好的感觉自由的指针,但我真的只是想解决目前的主要问题。你知道吗

代码如下:

from OSC import OSCServer,OSCClient, OSCMessage
import sys
from time import sleep
import time
import types
import os
import subprocess

server = OSCServer( ("10.1.1.143", 7002) )#This has to be the IP of the RaspberryPi on the network
client = OSCClient()

r = None
p = None
sr = 0
sp = 0
loop = 0

def playall(path, tags, args, source):
        global sp
        global p
        global sr
        global r
        global loop
        loop = int(args[0])
        if loop == 1:
            print "Play on Loop";
         for x in range(1,10):
            i = ""
            i = str(x)
            print "Loop Duration", loop;
            if sp == 0:
                        if sr == 0:
                            p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
                            sp = 1

                        else:
                            r.kill()
                            p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
                            sp = 1
                            sr = 0

            else:
                if sr == 0:
                    p.kill()
                    p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
                    sp = 1

                else:
                    p.kill()
                    r.kill()
                    p = subprocess.Popen(['ola_recorder', '-p', i, '-i 0'], stdout=subprocess.PIPE)
                    sp = 1
                    sr = 0
            time.sleep(5)
            if loop == 0:
                break

server.addMsgHandler("/3/playall", playall)

while True:
    server.handle_request()

server.close()

Tags: 代码importloopifserverstdoutglobalsp