为什么通过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
已经阅读了一个措辞相似的问题-我想这是范围上的不同,因为我想了解为什么输出不同。
答案 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()
,result
是CompletedProcess实例。 CompletedProcess.stdout
参数为:
从子进程中捕获标准输出。字节序列或字符串 如果使用编码或错误调用了run()。如果不是stdout则没有 捕获。
因此,作为字节序列或字符串,python在控制台上打印时以不同的方式表示它,显示所有填充物'\ n','\ xad','\ x97','\ x8f等。