我是新手,也是整个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
答案 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所说,您的代码可能无法正确暂停,您需要找到另一种方法。但这应该至少回答你的一个问题。