2009-10-21 69 views
1

我對Nautilus文件瀏覽器(AFAIK僅在GNU/Linux/Unix/etc環境中運行)有一個Python擴展。我決定拆分一個昂貴的計算並將其作爲一個子進程運行,醃製結果並通過管道發回。我的問題涉及這個腳本。由於計算需要一個路徑參數和一個布爾參數,我想我可以通過兩種方式做到這一點:通過一個管道發送一個醃製元組中的參數,或者在命令行上給它們。我發現pickle tuple方法明顯比僅僅提供參數要慢,所以我採用了子進程參數方法。對子進程的參數進行編碼.Popen

但是,我很擔心可能出現的本地化問題。目前,來電我:

subprocess.Popen(
    [sys.executable, path_to_script, path.encode("utf-8"), str(recurse)], 
    stdin = None, 
    stdout = subprocess.PIPE) 

在腳本:

path = unicode(sys.argv[1], "utf-8") 

我擔心的是編碼路徑參數爲UTF-8是一個錯誤,但我不知道當然。我想避免「它適用於我的機器」症候羣。如果用戶擁有latin1作爲默認字符編碼,這會失敗嗎?或者沒有關係?

回答

4

沒關係:只要腳本知道要爲參數指定utf-8編碼,就可以正確解碼它。 utf-8是正確的選擇,因爲它可以讓你對任何Unicode字符串進行編碼 - 不僅僅是針對某些語言的字符串,而是針對某些語言的字符串,因爲諸如Latin-1等選項需要!

+0

+1參數對Unicode沒有任何瞭解,它們只是傳遞字節,並由您來解釋它們。 – bobince 2009-10-21 02:32:40

+1

好的,這就是問題的實質:「參數必須是用戶區域編碼的字符串,還是隻能是任意字節序列?」看起來答案是後者。 謝謝:) – detly 2009-10-21 04:29:51

+0

@detly,是的,好的方式把它!接收參數的過程負責對它們進行解碼(如果需要的話),這當然有代價,但它也有一些優勢,比如允許「任意字節序列」(只要誰發送序列,收件人,關於其含義,編碼等等; - )。 – 2009-10-21 05:38:28

2

如果文件名應該是用戶可讀的,則使用sys.getfilesystemencoding()。但是,如果系統編碼不支持字符,則會導致問題。爲避免這種情況,您可以用一些字符序列替換缺失的字符(例如,通過註冊您自己的錯誤處理功能codecs.register_error())。

+0

在程序中的這個特定點上,路徑不應該對用戶可見。它只是將路徑傳遞給worker子進程的一種機制。 – detly 2009-10-22 01:55:01