[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