Python 为什么subprocess.run不读取新行,subprocess.call却读取新行?

Python 为什么subprocess.run不读取新行,subprocess.call却读取新行?,python,subprocess,Python,Subprocess,为什么通过subprocess.call调用可执行文件会给subprocess.run带来不同的结果 call方法的输出是完美的——删除了所有新行,文档的格式完全正确,“-”字符、项目符号和表格都得到了完美的处理 但是,使用run方法运行完全相同的函数并从stdout读取输出会完全抛出输出。满是“\n”、“ê\xad”、““\x97”和“\x8f”字符,并且到处都是空格 以下是我使用的代码: 子流程调用 子流程运行 我不明白为什么run方法不以同样的方式解析和显示文件。我会使用call,但是我需

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

call方法的输出是完美的——删除了所有新行,文档的格式完全正确,“-”字符、项目符号和表格都得到了完美的处理

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

以下是我使用的代码:

子流程调用

子流程运行

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

我可以仔细检查并确定所有在运行中没有使用的unicode,然后将其删除,但我认为运行方法必须更改一些编码/解码设置

编辑

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

我做了一些测试

您正在控制台上打印内容吗?在这两种情况下,尝试将文本发送到包含子流程的文本文件中,并查看其是否不同:

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。就我而言,它们是相同的

我怀疑您所经历的差异并不是严格地与子流程有关,而是控制台在这两种情况下如何表示输出

正如我在评论中的链接中所说,
call()

它相当于:
run(…).returncode
(输入和 检查参数(不受支持)

这就是您的
结果
存储了一个整数(返回代码),并且输出在控制台中打印出来,控制台似乎用正确的编码、换行符等来显示它

使用
run()。
CompletedProcess.stdout
参数是:

从子进程捕获标准输出。字节序列或字符串 如果使用一个或多个编码调用了run()。如果stdout不是 被俘


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

为什么在使用run时将universal\u newlines设置为True?您可以通过调用将其设置为默认值(aka None),这可能会解释输出difference@Viper-我应该提到我已经尝试添加这些选项,看看这是否保留了格式。我只使用stdout=PIPE运行它,但唯一真正的区别是它在启用universal_newlines=True的情况下清除了更多的unicode字符。因此,使用call会更好,但仍然不会提供与call相同的输出。这是一个很好的答案,谢谢@Valentino。正如您所建议的,我是在启用“-”选项的情况下输出到屏幕的,所以没有保存到文件中。保存到文件时,run和call生成完全相同的文档。我很欣赏关于为什么会在控制台中发生这种情况的描述,因为python将其表示为一个完整的流程。至于我的用例,我需要在变量中处理文本,所以我需要在控制台中去掉字符,但至少我知道为什么这会显示不同的结果。再次感谢!我并没有对此进行测试,但是如果您使用正确的编码将
CompletedProcess.stdout
字符串写入文本文件,您应该再次获得正确的文本。我看不出有什么理由它不起作用。我不知道您的用例是什么,但是如果需要在文本文件中再次保存文本,也许记住这一点可以为您节省一些时间。
result=subprocess.run(['/path_to_pdftotext','-layout','/path_to_file.pdf','-'],stdout=PIPE, stderr=PIPE, universal_newlines=True, encoding='utf-8')
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'])