簡體   English   中英

Python沒有從subprocess.check_call獲取原始二進制文件

[英]Python not getting raw binary from subprocess.check_call

如何讓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>

(如果我把'ord'稱為'?'我得到63.)我在Linux上使用Python 2.7。

注意:在OSX上運行相同的代碼對我來說是正確的。 問題是我在Linux服務器上運行它。

哇,這是有史以來最奇怪的問題,但我已經解決了!

事實證明它正在調用的程序(一個java程序)根據它的調用位置返回不同的編碼!

開發osx機器,從命令行返回字符很好,Linux服務器,返回它們很好,從Django應用程序調用,nope變成“?”。

為了解決這個問題,我最終將這個參數添加到命令:

-Dfile.encoding=utf-8

我在這里得到了這個想法 ,似乎有效。 還有一種方法可以在內部修改Java程序來執行此操作。

對不起,我責怪Python! 你們有正確的想法。

重定向( stdout=file )發生在文件描述符級別。 如果你看到Python,Python與寫入文件的內容無關? 而不是在文件本身(不在REPL中)。

如果它在OS X上運行並且它在Linux服務器上“無效”,則可能的原因是環境的差異,檢查LC_ALL,LC_CTYPE,LANG envvars-python, /bin/sh (由於shell=True ),如果未設置環境(C,POSIX語言環境), cmd可能會使用ASCII的語言環境編碼。

從子進程獲取“原始二進制”:

#!/usr/bin/env python
import subprocess

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

注意:

  • 沒有shell=True除非有必要,否則不要使用它
  • 如果檢測到輸出是不是tty,很多程序可能會改變他們的行為例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM