[英]Python subprocess.check_call terminate and start from where it terminated
[英]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
除非有必要,否則不要使用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.