【问题标题】:Why does subprocess.run not read new lines yet subprocess.call does?为什么 subprocess.run 不读取新行而 subprocess.call 呢?
【发布时间】:2019-06-25 00:16:26
【问题描述】:

为什么通过 subprocess.call 调用可执行文件会给 subprocess.run 带来不同的结果?

调用方法的输出很完美——所有新行都被删除了,文档的格式完全正确,'-'字符、项目符号和表格处理得很好。

但是,使用 run 方法运行完全相同的函数并从 stdout 读取输出会完全抛出输出。充满了 '\n'、'Â\xad'、'\x97'、'\x8f' 字符,并且到处都是空格。

这是我正在使用的代码:

Subprocess.CALL

result=subprocess.call(['/path_to_pdftotext','-layout','/path_to_file.pdf','-'])

Subprocess.RUN

result=subprocess.run(['/path_to_pdftotext','-layout','/path_to_file.pdf','-'],stdout=PIPE, stderr=PIPE, universal_newlines=True, encoding='utf-8')

我不明白为什么 run 方法不以相同的方式解析和显示文件。我会使用 call 但是我需要将 pdftotext 转换的结果保存到一个变量中(在运行的情况下:var = result.stdout)。

我可以通过并识别它在运行中没有拾取的所有 unicode 并将其剥离,但我认为运行方法必须更改一些编码/解码设置。

编辑

阅读了一个措辞相似的问题 - 我相信这在范围上有所不同,因为我想了解为什么输出不同。

【问题讨论】:

  • 为什么你在使用 run 的时候将 universal_newlines 设置为 True ?您通过调用将其设置为默认值(也称为无),这可能解释了输出差异
  • @Viper - 我应该提到我已经尝试添加这些选项以查看这是否保留了格式。我只使用 stdout=PIPE 运行它,但唯一真正的区别是它在启用了 universal_newlines=True 的情况下清除了更多的 unicode 字符。所以更好,但仍然没有提供与 call 相同的输出。

标签: python subprocess


【解决方案1】:

我做了一些测试。

您是否在控制台上打印内容?尝试在两种情况下都使用 subprocess 将文本发送到文本文件中,看看是否不同:

result=subprocess.call(['/path_to_pdftotext','-layout','/path_to_file.pdf','test.txt'])

result=subprocess.run(['/path_to_pdftotext','-layout','/path_to_file.pdf','test2.txt'])

并比较 test.txt 和 test2.txt。就我而言,它们是相同的。

我怀疑您遇到的差异与子流程并不严格相关,而是控制台在两种情况下如何表示输出。

正如我在cmets中链接的answer中所说,call()

相当于:run(...).returncode(除了输入和 不支持检查参数)

那是您的 result 存储一个整数(returncode),输出打印在控制台中,这似乎显示了正确的编码、换行符等。

对于run()result 是一个CompletedProcess 实例。 CompletedProcess.stdout 参数是:

从子进程捕获的标准输出。字节序列或字符串 如果使用编码或错误调用 run()。如果没有标准输出,则无 捕获。

因此,作为字节序列或字符串,python 在控制台上打印时以不同的方式表示它,显示所有内容 '\n'、'Â\xad'、'\x97'、'\x8f' 等等。

【讨论】:

  • 这是一个很好的答案,谢谢@Valentino。正如您所建议的,我在启用“-”选项的情况下输出到屏幕,因此没有保存到文件中。保存到文件时运行和调用都会生成完全相同的文档。我很欣赏关于为什么在控制台中发生这种情况的描述,这是由于 python 将其表示为 CompletedProcess 的方式。至于我的用例,我需要在变量中摆弄处理过的文本,所以我需要去掉控制台中的字符,但至少我知道为什么这会显示不同的结果。再次感谢!
  • 我没有去测试这个,但是如果你将CompletedProcess.stdout 字符串写入具有正确编码的文本文件,你应该再次获得正确的文本。我看不出它为什么不工作的理由。我不知道您的用例是什么,但是如果涉及将文本再次保存在文本文件中,也许记住这一点可以节省一些剥离。
猜你喜欢
  • 2017-04-03
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2012-05-31
  • 2023-04-05
  • 2015-09-13
  • 2015-03-06
  • 2010-11-17
相关资源
最近更新 更多