虽然这是一个非常具体的益智游戏,但我想这里提出的问题更为一般。
我要做的是建立一个简单的媒体播放器,以获得乐趣和学习。我正在尝试使用https://github.com/n1ck3/mplayer.py生成 mplayer 并命令 mplayer 实例播放一些音频文件。
首先,我在旧系统上构建了一个测试程序,看起来基本上是这样的:
player = Player()
player.loadfile(SOUND_FILE)
while (player.time_pos is not None):
print(player.time_pos)
time.sleep(1)
这在使用python 3.4的旧系统上完美运行。现在我切换到最近的Ubuntu上运行python 3.5的系统,奇怪的是它不再起作用了。
我尽可能地追查问题。在我的旧系统上,循环将正常休眠一秒钟, mplayer 子进程将按预期在后台运行。在新系统上, mplayer 子进程只运行查询player.time_pos
将执行的那一小部分。然后子进程将休眠,不再在后台运行,直到player.time_pos
再次查询。
可以通过观察print(player.time_pos)
的输出来跟踪这一点:在旧系统上,输出数字将按预期每秒快速增加,但在新系统上,它们只会非常非常非常缓慢地增长。如果我删除了sleep
语句,我可以听到声音,但由于很多小的中断,它会有点慢,而且非常嘈杂。
我看了一下 mplayer 模块的实现。它在内部使用subprocess
并通过管道连接到产生的 mplayer 进程:
self._proc = subprocess.Popen(args, stdin=subprocess.PIPE,
stdout=self._stdout._handle, stderr=self._stderr._handle,
fsize=16384, close_fds=(sys.platform != 'win32'))
注意:我在这里试验了fsize
,但没有效果。
有什么变化从python 3.4到3.5我不知道?现在还需要更多选项才能让 mplayer 进程在后台运行吗?我还没有和subprocess
合作,所以你有一些信息告诉我为什么这不能按预期工作?