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

时间:2019-01-31 14:00:38

标签: python subprocess

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

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

但是,使用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方法更改的编码/解码设置。

EDIT

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

1 个答案:

答案 0 :(得分:1)

我做了一些测试。

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

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

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

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

  

它等效于:run(...).returncode(除了输入和   检查参数不受支持)

也就是说,您的result存储了一个整数(returncode),并且输出显示在控制台中,它似乎以正确的编码,换行符等显示了它。

对于run()resultCompletedProcess实例。 CompletedProcess.stdout参数为:

  

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

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