2013-12-19 13 views
0

當試圖運行Python腳本,例如:Python的參數被讀作代碼

python test.py --test 'Test' 

就顯得getopt的是失敗。和打印sys.argv中透露:

['test.py', '\xe2\x80\x94-test', '\xe2\x80\x9cTest\xe2\x80\x9d'] 

我在OS X上覆制並粘貼命令到終端的命令是可能已經在Windows中保存的文本文件。這有什麼可能的原因,因爲我之前沒有遇到過這個問題?

如果我在終端中重新鍵入命令它工作正常。有沒有辦法處理腳本中的參數,以便正確解釋它們?

+1

它真的是一個文本文件,還是像Word文檔? – user2357112

+0

它可能在Windows上的Notepad ++或OS X上的TextWrangler中。但它可能已複製到臨時新文件中/作爲未保存的新文件,因此沒有適當的格式設置。 – jensph

回答

4

您的Windows編輯器替換爲破折號正規劃線,並用「花哨」的風格引述報價:

>>> '\xe2\x80\x94-test'.decode('utf8') 
u'\u2014-test' 
>>> print '\xe2\x80\x94-test'.decode('utf8') 
—-test 
>>> '\xe2\x80\x9cTest\xe2\x80\x9d'.decode('utf8') 
u'\u201cTest\u201d' 
>>> print '\xe2\x80\x9cTest\xe2\x80\x9d'.decode('utf8') 
「Test」 
>>> import unicodedata 
>>> for u in u'\u2014\u201c\u201d': 
...  print u, unicodedata.name(u) 
... 
— EM DASH 
「 LEFT DOUBLE QUOTATION MARK 
」 RIGHT DOUBLE QUOTATION MARK 

下一次使用一個面向文本的編輯;文字處理器可能會用「漂亮」的版本替換文本。

你可以做unicode.translate()電話:

>>> import sys 
>>> sys.argv = ['test.py', '\xe2\x80\x94-test', '\xe2\x80\x9cTest\xe2\x80\x9d'] 
>>> map = {0x2014: u'-', 0x201c: u"'", 0x201d: u"'"} 
>>> sys.argv[1:] = [s.decode('utf8').translate(map).encode('utf8') for s in sys.argv[1:]] 
>>> sys.argv 
['test.py', '--test', "'Test'"] 

注意,外殼不會空白正確解析,因爲它沒有正規報價與合作;您可能需要使用上述方法第一個翻譯文本文件,然後將正確引用的字符串粘貼到shell中。

+0

完美,謝謝。我想我不會嘗試解碼,而是以某種方式檢測到有問題,然後用不解析的參數向終端發出警告。 – jensph