Python子进程Popen.terminate()仍然停留在wait()
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python子进程Popen.terminate()仍然停留在wait(),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2199字,纯文字阅读大概需要4分钟。
内容图文
![Python子进程Popen.terminate()仍然停留在wait()](/upload/InfoBanner/zyjiaocheng/965/08890bc2de354002a7b236bd78223536.jpg)
我正在尝试使用RPi实现一个无线电播放器.目标是设置播放列表并在填充播放列表后开始播放.一旦执行停止代码,播放器和无线电进程将退出.
无线电过程很好地终止,但即使在呼叫终止后,播放器进程仍然处于等待状态.如果再次调用停止代码,则播放器进程终止
事情尝试:
>重新排序等待命令(播放器,收音机)/(收音机,播放器)
>类似地重新排序终止命令
>使用kill而不是终止挂起RPi
玩家代码:
while playlist:
player = subprocess.Popen(
["avconv", "-i", "Music/%s" % playlist[0], "-f", "s16le", "-ar",
"22.05k", "-ac", "1", "-"], stdout=subprocess.PIPE)
radio = subprocess.Popen(["./pifm", "-", freq], stdin=player.stdout)
radio.wait()
print "************ exiting from radio :)"
player.wait()
print "************ exiting from player :)"
playlist.pop(0)
player = None
radio = None
播放器停止代码(从另一个线程调用):
print "************ stop requested"
if radio and radio.poll() is None:
print "************ terminating radio :)"
radio.terminate()
if player and player.poll() is None:
print "************ terminating player :)"
player.terminate()
替代方案:
另一种选择是为播放器提供无线电和按需处理的持久接收器
def start_radio():
global radio
radio = subprocess.Popen(["./pifm"...], stdin=subprocess.PIPE)
def play():
global player
while playlist and radio:
player = subprocess.Popen(["avconv"...], stdout=radio.stdin)
player.wait()
playlist.pop(0)
def stop():
if player and player.poll() is None:
print "************ terminating player :)"
player.terminate()
但在这种情况下,调用player.terminate()会关闭播放器,同时在无线电过程中重复播放最后一个数据包(如卡住的记录).这个卡住的记录播放,直到我开始一个新的播放器或终止收音机.
解决方法:
正如@ J.F.Sebastian所提到的,使用player.stdout.close()可以正常工作.整个代码库在这里发布https://github.com/hex007/pifm_server
所以最终的代码看起来像这样
while playlist:
player = subprocess.Popen(
["avconv", "-i", "Music/%s" % playlist[0], "-f", "s16le", "-ar",
"22.05k", "-ac", "1", "-"], stdout=subprocess.PIPE)
radio = subprocess.Popen(["./pifm", "-", freq], stdin=player.stdout)
player.stdout.close()
radio.wait()
player.wait()
if stop_requested:
stop_requested = False
break
playlist.pop(0)
player = None
radio = None
和停止代码:
stop_requested = True
if radio and radio.poll() is None:
radio.terminate()
if player and player.poll() is None:
player.terminate()
内容总结
以上是互联网集市为您收集整理的Python子进程Popen.terminate()仍然停留在wait()全部内容,希望文章能够帮你解决Python子进程Popen.terminate()仍然停留在wait()所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。