Python没有从subprocess.check_call获取原始二进制文件

时间:2016-05-16 01:46:15

标签: python python-2.7 unicode subprocess

如何让subprocess.check_call为我提供命令的原始二进制输出,它似乎在某处错误地编码。

详细说明:

我有一个返回如下文本的命令:

some output text “quote” ...

(那些引号是unicode e2809d)

以下是我如何调用命令:

f_output = SpooledTemporaryFile()
subprocess.check_call(cmd, shell=True, stdout=f_output)
f_output.seek(0)
output = f_output.read()

问题是我得到了这个:

>>> repr(output)
some output text ?quote? ...
>>> type(output)
<str>

(如果我打电话给&#39; ord&#39;&#39;?&#39;我得到63.) 我在Linux上使用Python 2.7。

注意:在OSX上运行相同的代码对我来说是正确的。问题是我在Linux服务器上运行它。

2 个答案:

答案 0 :(得分:1)

哇,这是有史以来最奇怪的问题,但我已经修好了!

事实证明它正在调用的程序(一个java程序)根据它的调用位置返回不同的编码!

开发osx机器,从命令行返回字符很好,Linux服务器,返回它们很好,从Django应用程序调用,nope变成&#34;?&#34; s。

为了解决这个问题,我最终将这个参数添加到命令中:

-Dfile.encoding=utf-8

I got that idea here,似乎有效。还有一种在内部修改Java程序的方法。

抱歉,我责怪Python!你们有正确的想法。

答案 1 :(得分:0)

重定向(stdout=file)发生在文件描述符级别。如果您在文件本身(而不是在REPL中)看到?而不是,则Python与写入文件的内容无关。

如果它适用于OS X而且它不会起作用&#34;在Linux服务器上然后可能的原因是环境的差异,检查LC_ALL,LC_CTYPE,LANG envvars-python,/bin/sh(由于shell=True),cmd可能使用您的语言环境如果未设置环境(C,POSIX语言环境),则为ASCII编码。

获得&#34;原始二进制&#34;来自子流程:

#!/usr/bin/env python
import subprocess

raw_binary = subprocess.check_output(['cmd', 'arg 1', 'arg 2'])
print(repr(raw_binary))

注意:

  • shell=True - 除非有必要,否则不要使用
  • 如果许多程序检测到输出不是tty example,则可能会改变其行为。