Python,根据收到的消息暂停子进程

时间:2014-07-19 00:12:06

标签: python subprocess

我是新手,也是整个Python编码的新手,我的编程知识很少。 我正在设计一个代码,在GTalk上接收IM,并根据收到的消息运行子进程(OMXPlayer上的mp4或mp3文件)。目前我可以运行子进程,但我无法暂停/停止mp3 / mp4文件(子进程)。有什么建议吗?

def message_handler(connect_object, message_node):

    R = (message_node.getBody())

    if R == "video" :

        movie_path = '/home/pi/Desktop/media/video.mp4'
        p = subprocess.Popen(['omxplayer',movie_path])

    elif R == "music" :

        movie_path = '/home/pi/Desktop/media/music.mp3'
        p = subprocess.Popen(['omxplayer',movie_path])

    elif R == "pause":

        p.kill() # it gives me erroe "p is not defined"
        os.kill(p.pid, signal.SIGSTOP) # doesn't do nothing

   else:

       pass

2 个答案:

答案 0 :(得分:1)

这有两个问题。首先,您的变量“p”在if块中定义,因此在该特定块之外不可用。 其次,你实际上没有暂停这个过程,你告诉它要终止。你可能想要做的是为你的omxplayer过程创建一个命名管道,并通过omxplayer将指令提供给你。然而,这是相当先进的。 (或者不是,随着研究的进展)

p = None #This initializes the variables globally.

def message_handler(connect_object, message_node):
    R = (message_node.getBody())
    if R== "video" :
        movie_path= '/home/pi/Desktop/media/video.mp4'
        p = subprocess.Popen(['omxplayer', movie_path],stdin=subprocess.PIPE)
    elif R== "pause":
        p.stdin.write('\x20') #Much cleaner alternative to named pipes...
    else:
        pass

请注意,这不是完整的代码,它只是一个指向正确方向的指针。

答案 1 :(得分:0)

当您在函数中声明类似p的变量时,它只存在于该函数的名称空间中 - 在该时间点可访问的已定义变量和函数的列表。您正在使用popen创建子流程对象,并将其绑定到函数p中的message_handler,并且该p存在于message_handler的命名空间中。一旦p退出,其名称空间就会随之消失 - 绑定到message_handler也是如此。然后,当您下次访问def message_handler(connect_object, message_node, p): R = (message_node.getBody()) if R == "video" : movie_path = '/home/pi/Desktop/media/video.mp4' p = subprocess.Popen(['omxplayer',movie_path]) elif R == "music" : movie_path = '/home/pi/Desktop/media/music.mp3' p = subprocess.Popen(['omxplayer',movie_path]) elif R == "pause": p.kill() # it gives me erroe "p is not defined" os.kill(p.pid, signal.SIGSTOP) # doesn't do nothing else: pass return p 时,您无法访问同一个对象。

更好的选择是让你的函数接受并返回对象:

p

如果你这样做,{{1}}已在函数之外定义,现在存在于你调用函数的任何命名空间中。

现在,正如Kenneth Aalberg所说,您的代码可能无法正确暂停,您需要找到另一种方法。但这应该至少回答你的一个问题。