python-3.x - Python 3 子进程未捕获完整的标准输出
问题描述
我正在构建一个 Python 3.7(但也尝试过 3.5)脚本来自动下载和转码 podcast-dl 工具(https://www.npmjs.com/package/podcast-dl)之上的播客。您可以在链接中看到它的实际效果;基本行为是:
当一个剧集已经下载时,它会在控制台上打印类似这样的消息:
1 of 2
Title: The title of the episode
Publish Date: Mon, 02 Aug 2021 12:23:34 +0200
Download exists locally. Skipping
当需要下载一集时,输出会自动更新以指示下载的当前状态(因此最后一行不断变化)
1 of 2
Title: La Hermandad Podcast 10x12: el programa de... algo, pero verano.
Publish Date: Mon, 02 Aug 2021 12:23:34 +0200
downloading... 100.00% of 78.69 MB
我可以将程序的输出重定向到一个文件,一切都很好,所以我只能看到下载最后一行的最终状态,所以 100% 完成。
尝试使用 Subprocess 启动程序并解析 stdout 时出现问题。我尝试过使用两种不同的方法...
o_process = subprocess.Popen(plu_cmd,
bufsize=0,
universal_newlines=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# METHOD 1
o_process.wait()
u_stdout = o_process.stdout.read()
u_stderr = o_process.stderr.read()
# METHOD 2
u_stdout, u_stderr = o_process.communicate()
...结果相同,下载剧集的最后一行显示为空。我在下面添加了额外的代码来检查输入脚本执行行和生成的标准输出:
# --- TEST CODE ---
print('CMD: %s' % repr(plu_cmd))
print('STDOUT: %s' % repr(u_stdout))
# ------ end ------
对于方法 1 和 2,我得到:
CMD: ('/my_dir/podcast-dl-linux-x64', '--url', 'https://www.ivoox.com/feed_fg_f133371_filtro_1.xml', '--out-dir', '/my_output_dir', '--limit', '2', '--episode-template', '{{release_date}}_{{title}}')
STDOUT: 'Starting download of 2 episodes\n\n1 of 2\nTitle: La Hermandad Podcast 10x12: el programa de... algo, pero verano.\nPublish Date: Mon, 02 Aug 2021 12:23:34 +0200\n\n2 of 2\nTitle: La Hermandad Podcast 10x11: veraneando en la guerra del mañana\nPublish Date: Tue, 06 Jul 2021 13:53:26 +0200\n\n'
几天来我一直在挠头并尝试不同的“修复”(例如实时读取标准输出),但似乎没有任何效果。关于如何解决问题的任何想法?一个讨厌的解决方法是将标准输出保存到文件中(尽管在命令行中使用“> output.txt”似乎不起作用)然后读取它。
提前致以问候和非常感谢
解决方案
推荐阅读
- r - 年度时间序列数据绘图
- python - Python 使用带有 if 语句的 tkcalendar
- sql-server - 带有 UNION 子句的 ORDER BY
- postgresql - 在PostgreSQL中插入行时如何根据另一个字段自动设置一个字段?
- php - 使用 PHP 从 .pfx 文件中提取序列号
- ios - 在 UITableView 之间添加分节分隔符
- python - Turtlebot 3 中不存在 Frame[map]?
- openlayers - 如何更改 openlayers 6 和 ol-ext 中的默认图标?
- pagespeed - Google 页面速度错误 - Lighthouse 返回错误:此请求渲染时间过长
- swift - AVPlayer url 持续时间 Xcode 12