[Mac] 執行 python 出現 Symbol not found: __PyCodecInfo_GetIncrementalDecoder 錯誤

[Mac] 執行 python 出現 Symbol not found: __PyCodecInfo_GetIncrementalDecoder 錯誤

今天在 Mac 上裝 pylint,裝好之後,執行卻出現奇怪的錯誤訊息,

說 Symbol not found: __PyCodecInfo_GetIncrementalDecoder:

testuser@localhost ~ $ pylint

Traceback (most recent call last):
  File "/Users/testuser/Dropbox/AutoIt/AutoIntegrate/__init__.py", line 2, in
    import pipes
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pipes.py", line 62, in
    import tempfile
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tempfile.py", line 32, in
    import io as _io
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/io.py", line 51, in
    import _io
ImportError: dlopen(/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
  Referenced from: /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
  Expected in: flat namespace
 in /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so

 

真的很奇怪,因為幾分鐘前 pylint 還會動,但現在就不會動了,

這段時間內有用過 Homebrew 安裝了一個工具,

隱約有看到 Homebrew 也安裝了其他關聯的模組,包含 python。

這和這個問題有什麼關係嗎?

 

上網查了一下,有人解釋的相當清楚,

原來是因為 Mac 上預設的 python 是 /usr/bin/python,

但用 Homebrew 安裝 python 之後,會裝在 /usr/local/bin/python,

通常在 $PATH 裡面,/usr/local/bin 的優先權是比 /usr/bin 要高的,

因此直接執行 python 會找到 /usr/local/bin/python。

 

然而,bash 又有快取 (cache) 的功能,

因此 bash 會記得 python 是在 /usr/bin/python。

這會導致直接執行 python 時,bash 是去執行了 /usr/bin/python,

但 sys.path 寫入的是 /usr/local/bin/python 的路徑,

所以相關的模組也都會用到 /usr/local/bin/python 關聯的路徑,

混用之下,就出錯了~

 

網友提供了一個測試的方法,

用 /usr/local/bin/python 直接執行 import io,沒有錯誤:

testuser@localhost ~ $ /usr/local/bin/python -c "import io"

 

但用 python 執行 import io,就會出錯:

testuser@localhost ~ $ python -c "import io"

Traceback (most recent call last):
  File "", line 1, in
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/io.py", line 51, in
    import _io
ImportError: dlopen(/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
  Referenced from: /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
  Expected in: flat namespace
 in /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so

 

解決的方法有兩種,一個是登出 Mac 後再登入,

另一種是用 hash 指令,叫 bash 重新取得 python 的快取:

hash -r python

 

執行完 hash 指令後,再試一次 python 執行 import io,就正常了:

testuser@localhost ~ $ python -c "import io"

 

當然 pylint 也回復正常囉~

 

參考資料:Symbol not found: __PyCodecInfo_GetIncrementalDecoder

(本頁面已被瀏覽過 1,107 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料