首页 > 解决方案 > 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”似乎不起作用)然后读取它。

提前致以问候和非常感谢

标签: python-3.xsubprocess

解决方案


推荐阅读