簡體   English   中英

pip UnicodeDecodeError: 'utf8' 編解碼器無法解碼字節

[英]pip UnicodeDecodeError: 'utf8' codec can't decode byte

我運行pip ,無論我傳遞給pip什么標志,我總是收到以下錯誤:

$ pip --version
Traceback (most recent call last):
    [...irrelevant details omitted...]
      File "/usr/lib64/python2.7/codecs.py", line 314, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf6 in position 203: invalid start byte

這是怎么回事? 我該如何解決?

我安裝了 pip 版本 8.0.2。 更改或清除LANGLC_ALL環境變量無濟於事。 我一定在這里閱讀了十幾個其他問題,但我正在努力尋找任何可以明確說明問題是什么或如何解決的問題。

這是怎么回事

pip有問題。 如果任何已安裝的 Python 系統庫在庫描述中包含非 ASCII 字符,則它可能會崩潰。

錯誤消息的相關部分是這樣的:

UnicodeDecodeError: 'utf8' codec can't decode byte ...

特定的字節值並不重要。 崩潰是由存儲 Python 包的系統目錄中的.egg-info文件中的某種非 ASCII 字符觸發的(例如, /usr/lib/python2.7/site-packages )。 pip嘗試解析所有這些文件,當它遇到某些非 ASCII 字符時,它會摔倒並死亡。

如何解決問題

有兩種選擇:

  1. 正確的解決方法:將pip更新到最新版本。 這修復了錯誤。

  2. kludge:刪除觸發pip崩潰的有問題的 Python 庫包。 這需要你弄清楚哪個 Python 庫包負責; 不幸的是, pip並沒有給你太多的幫助來解決這個問題,所以你將不得不做一些調查來解決這個問題——請參閱下一節。

顯然,前一種選擇更可取……但如果由於某種原因您無法升級pip ,我將描述如何遵循第二種方法。

如何找到對此負責的 Python 庫

以下是如何檢查 Python 系統包並縮小可能導致pip崩潰的原因。 我們將在 Python site-packages/目錄中*.egg-info任何具有非 ASCII 字符的*.egg-info文件。 嘗試這個:

cd /usr/lib/python2.7/site-packages
LANG=ascii grep -P  '[[:^ascii:]]' *.egg-info 2>/dev/null

(這需要 GNU grep。)查看它找到的匹配項。 檢查每個文件以查看它是否包含與錯誤消息匹配的非 ASCII 字符。

就我而言,提到的錯誤消息can't decode byte 0xf6 ,因此我們將查找包含0xf6字節的文件。 我們可以使用十六進制轉儲實用程序檢查每個匹配的文件; 我喜歡使用hexdump -C

要找到匹配項,您可能需要檢查 Python 包的其他位置,例如/usr/lib64/python2.7/site-packages/usr/local/lib/python2.7/site-packages等。

一旦找到導致問題的 Python 包,您可以嘗試刪除該庫(如果它不是必需的包)。

其他可能的解釋和故障排除步驟

在較舊的系統上,如果您的當前路徑或用戶名包含任何非 ASCII 字符,也可能觸發此錯誤。

有些人報告說他們通過清除LC_ALLLANG環境變量,或者將它們設置為不同的設置,例如export LC_ALL="en_US.UTF-8" LANG="en_US.UTF-8" 不過,這對我沒有幫助。

其他閱讀

我發現有幫助的參考資料:

暫無
暫無

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

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