现在的情况
我正在编写一个小型 Python 程序来播放终端中 8tracks 的播放列表。
它由三部分组成,一个client.py
使用 stdlib 的cmd模块,一个api.py
使用 python-requests 访问 API 的player.py
模块和一个在从属模式下创建 mplayer 子进程并向其发送命令的模块。
问题
到目前为止,这是可行的,问题是除了轮询子进程的标准输出之外,我没有其他方法可以判断歌曲是否已在 mplayer 中播放完毕。这意味着我必须观看该过程,以便在歌曲播放完毕后请求并开始播放列表的下一首歌曲。
问题是等待子进程会阻塞cmd
模块的主循环。不过,我也不能简单地在单独的线程或进程中运行它,因为我必须共享对子进程的 stdout 的引用,而像这样的引用不能在进程之间共享。
可能的方法
我为此想到了不同的解决方案。我可以放入player.py
一个单独的进程并通过队列发送文本命令,但这会使事情变得过于复杂。我可以创建一个 Twisted 应用程序,但 Twisted 相当大,我不知道从哪里开始。另外,我不希望在我的项目中有这样的依赖。
第三种解决方案是使用 Gevent。问题是我如何让它与cmd
模块一起工作。据我了解 Gevent,我将不得不在我“等待”某事的每个地方屈服。在这种情况下,这将是在 HTTP 请求期间、在等待期间cmd.cmdloop()
以及在子进程轮询之间的暂停期间。但是如何让cmd
模块产生?某种子类或猴子补丁?