path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...
前言:
筆者不過是一個剛立下flag要學習Python的小白,
(這也是筆者的第一篇網文、知乎文,如果沒用,求輕虐),
為此還沖動傻傻地配了一臺2019款13寸的MacBook Pro。
電腦配置(作為參考)如下:
MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
系統:macOS Catalina 10.15.4
處理器:2.4 GHz 四核Intel Core i5
內存:16 GB 2133 MHz LPDDR3
顯卡:Intel Iris Plus Graphics 655 1536 MB
-------------------------------分割線-------------------------------
正文:
我們開始這次撞墻之旅吧~~~
事情的經過是這樣的,筆者為了學習Python,在網上翻了很多論壇和帖子,配置好了基本環境。
筆者的環境基本是這樣:
1、用Homebrew來管理軟件。
2、用iTerm2 + Oh My Zsh代替蘋果自帶的終端。
3、用pyenv來安裝管理Python版本,然后安裝了Python3.8.2。
4、用PyCharm來當IDE(集成開發環境)。【懵懵懂懂的筆者看了推薦網文,也偷偷安裝了VSCode來假裝會用】
隨后就天真爛漫地開始了Python400集的視頻教程。
萬萬沒想到!!!
到了第5課《Python程序格式_縮進_行注釋_段注釋》時,筆者就卡住了!!!
這節課的標題看起來沒啥問題吧?還只是基礎理論的講解。
可偏偏里面老師講課時用了這段代碼來示范,而且還要學生自己敲一遍。
#導入海龜繪圖模塊 import turtle t = turtle.Pen() #這是一個循壞 for x in range(360):t.forward(x)t.left(59) ''' 測試一下段注釋 '''沒錯,當筆者用PyCharm敲完代碼,run一下,呵呵,報錯了。
但大致的跟這個差不多:(當時報錯的日志沒保存,沒想過要寫這篇文章哈哈哈哈)
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 36, in <module>import _tkinter # If this fails your Python may not be configured for Tk ModuleNotFoundError: No module named '_tkinter'重點是提示這個:(大概意思就是缺少一個叫tkinter的模塊)
ModuleNotFoundError: No module named '_tkinter'當時筆者是崩潰的,明明照著老師的來敲,怎么就報錯了。
筆者不死心,直接復制課件里面的代碼,再run一遍,呵呵,還是報錯了。
筆者就更加崩潰了,不過遇到問題,只能迎刃而上啊!
于是開始全網搜這個報錯的解決辦法。
這才發現原來這不是筆者一個人的問題啊,簡直是所有人的問題啊!!!
隨后筆者跟著網帖的各種教程去弄,還是不行。
期間還出現了新的報錯:(當時報錯的日志也沒保存)
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 4552, in _testroot = Tk()File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2263, in __init__self._loadtk()File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2279, in _loadtkraise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)" RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)這個報錯的重點是:(大概意思就是tk版本不匹配)
RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)翻了很多論壇和帖子才發現造成問題的原因有很多,結果筆者中招的應該是最多的。
筆者總結網上的三大原因(中間還有很多配置原因就不說了):
1、蘋果自帶的Python2.7.16和tk8.5版本跟另外安裝Python3.8.2不匹配。
2、pyenv能安裝管理不同版本的Python,但沒有管理tcl-tk的功能。
3、安裝Python3.8.2后才安裝tcl-tk。
-------------------------------分割線-------------------------------
尋求解決方案期間筆者崩潰了好多次,過程很心酸,就不多說了,直接上干貨吧!
解決方案:(大家按照步驟一步步來,應該可以解決,心里還是沒自信嘻嘻嘻)
1、確保環境是干凈的,不管三七二十一,在終端或iTerm里按順序執行下面的命令吧。
如果你沒有安裝過任何東西,只是第一次配置環境,可以跳過第一步。(但執行一下也不會有影響,而且來看這篇文章的應該都已經中超了吧紅紅火火恍恍惚惚)
pyenv versions#查看已安裝的Python版本
pyenv uninstall <version>#卸載版本號為<version>的Python,把前面查詢到的除了system以外的版本都卸載干凈
brew uninstall pyenv#卸載pyenv
rm -rf ~/.pyenv#清理pyenv殘留文件
brew uninstall tcl-tk#卸載tcl-tk
rm -rf ~/.tcl-tk#清理tcl-tk殘留文件
brew uninstall zlib#卸載zlib
rm -rf ~/.zlib#清理zlib殘留文件
brew uninstall python#卸載通過Homebrew安裝的Python版本
brew cleanup#刪除程序,所有程序老版刪除
至此,電腦的環境應該是干凈的了,至少筆者當時就是操作了這么多來確保干凈。
2、保證其他軟件更新至最新版本
brew update#更新軟件,把所有的Formula目錄更新,并且會對本機已經安裝并有更新的軟件用*標明。
3、安裝zlib并設置配置文件的環境變量
brew install zlib#安裝zlib
設置配置文件的環境變量的方法有兩種:
第一種:用vi編輯配置文件,手動添加
vi ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,編輯.bashrc配置文件
vi ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,編輯.zshrc配置文件
打開~/.bashrc或者~/.zshrc配置文件后,在文件最后添加以下命令
# For compilers to find zlib you may need to set: export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib" export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"# For pkg-config to find zlib you may need to set: export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"編輯添加后,按esc鍵,然后手動輸入:wq(冒號:也需要輸入),以保存并推出編輯模式。
第二種:在蘋果自帶的終端或iTerm里用以下命令直接添加至配置文件
echo '# For compilers to find zlib you may need to set: export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib" export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"# For pkg-config to find zlib you may need to set: export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"' >> ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,把設置zlib的環境變量的命令添加至.bashrc配置文件中
echo '# For compilers to find zlib you may need to set: export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib" export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"# For pkg-config to find zlib you may need to set: export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"' >> ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,把設置zlib的環境變量的命令添加至.zshrc配置文件中
#設置zlib的環境變量的命令,具體含義筆者不懂!!!只知道很有用!!!
添加完畢后,執行以下命令或者關閉終端、iTerm窗口重新打開。
source ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,使剛才設置的環境變量命令生效
source ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,使剛才設置的環境變量命令生效
至此,已經安裝并設置好zlib的環境變量,至少筆者看到網文的教程是這樣的。
4、安裝tcl-tk并設置配置文件的環境變量
brew install tcl-tk#安裝tcl-tk(這個就是前面一直說的tk,非常重要!!!)
設置配置文件的環境變量的方法同樣有兩種:(但只筆者推薦使用第一種)
第一種:用vi編輯配置文件,手動添加
vi ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,編輯.bashrc配置文件
vi ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,編輯.zshrc配置文件
打開~/.bashrc或者~/.zshrc配置文件后,在文件中開頭部分(這個最好是放在開頭,因為讀取配置文件時會先運行,所以不建議使用第二種方法,因為命令添加只會添加至文件最后)添加以下命令
#If you need to have tcl-tk first in your PATH run: export PATH="/usr/local/opt/tcl-tk/bin:$PATH"#For compilers to find tcl-tk you may need to set: export LDFLAGS="-L/usr/local/opt/tcl-tk/lib" export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"#For pkg-config to find tcl-tk you may need to set: export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"編輯添加后,按esc鍵,然后手動輸入:wq(冒號:也需要輸入),以保存并推出編輯模式。
第二種:在蘋果自帶的終端或iTerm里用以下命令直接添加至配置文件(不建議使用這個方法,因為命令添加只會添加至文件最后,當然筆者沒試過放在最后效果怎么樣)
echo '#If you need to have tcl-tk first in your PATH run: export PATH="/usr/local/opt/tcl-tk/bin:$PATH"#For compilers to find tcl-tk you may need to set: export LDFLAGS="-L/usr/local/opt/tcl-tk/lib" export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"#For pkg-config to find tcl-tk you may need to set: export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"' >> ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,把設置tcl-tk的環境變量的命令添加至.bashrc配置文件中
echo '#If you need to have tcl-tk first in your PATH run: export PATH="/usr/local/opt/tcl-tk/bin:$PATH"#For compilers to find tcl-tk you may need to set: export LDFLAGS="-L/usr/local/opt/tcl-tk/lib" export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"#For pkg-config to find tcl-tk you may need to set: export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"' >> ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,把設置tcl-tk的環境變量的命令添加至.zshrc配置文件中
#設置tcl-tk的環境變量的命令,具體含義筆者也不懂!!!只知道很有用!!!
添加完畢后,執行以下命令或者關閉終端、iTerm窗口重新打開。
source ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,使剛才設置的環境變量命令生效
source ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,使剛才設置的環境變量命令生效
至此,已經安裝并設置好tcl-tk的環境變量,至少筆者看到網文的教程就是這樣的。(記得添加的位置最好在開頭部分,提醒四次應該都看到了吧?)
5、安裝pyenv并設置配置文件的環境變量
brew install pyenv#安裝pyenv
設置配置文件的環境變量的方法同樣有兩種:
第一種:用vi編輯配置文件,手動添加
vi ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,編輯.bashrc配置文件
vi ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,編輯.zshrc配置文件
打開~/.bashrc或者~/.zshrc配置文件后,在文件最后添加以下命令
#For Define environment variable PYENV_ROOT to point to the path where pyenv repo is cloned and add $PYENV_ROOT/bin to your $PATH for access to the pyenv command-line utility: export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH"#For Add pyenv init to your shell to enable shims and autocompletion. Please make sure eval "$(pyenv init -)" is placed toward the end of the shell configuration file since it manipulates PATH during the initialization: if command -v pyenv 1>/dev/null 2>&1; theneval "$(pyenv init -)" fi編輯添加后,按esc鍵,然后手動輸入:wq(冒號:也需要輸入),以保存并推出編輯模式。
第二種:在蘋果自帶的終端或iTerm里用以下命令直接添加至配置文件
echo '#For Define environment variable PYENV_ROOT to point to the path where pyenv repo is cloned and add $PYENV_ROOT/bin to your $PATH for access to the pyenv command-line utility: export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH"#For Add pyenv init to your shell to enable shims and autocompletion. Please make sure eval "$(pyenv init -)" is placed toward the end of the shell configuration file since it manipulates PATH during the initialization: if command -v pyenv 1>/dev/null 2>&1; theneval "$(pyenv init -)" fi' >> ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,把設置pynev的環境變量的命令添加至.bashrc配置文件中
echo '#For Define environment variable PYENV_ROOT to point to the path where pyenv repo is cloned and add $PYENV_ROOT/bin to your $PATH for access to the pyenv command-line utility: export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH"#For Add pyenv init to your shell to enable shims and autocompletion. Please make sure eval "$(pyenv init -)" is placed toward the end of the shell configuration file since it manipulates PATH during the initialization: if command -v pyenv 1>/dev/null 2>&1; theneval "$(pyenv init -)" fi' >> ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,把設置pynev的環境變量的命令添加至.zshrc配置文件中
#設置pynev的環境變量的命令,具體含義筆者都不懂!!!只知道很有用!!!
添加完畢后,執行以下命令或者關閉終端、iTerm窗口重新打開。
source ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,使剛才設置的環境變量命令生效
source ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,使剛才設置的環境變量命令生效
至此,已經安裝并設置好pynev的環境變量,至少筆者看到GitHub的pyenv安裝說明就是這樣的。
6、安裝Python3.8.2(截止筆者寫完本文的最新版本)并設置默認Python版本
pyenv install -l#查看可安裝的Python版本
pyenv install 3.8.2# 安裝版本號為3.8.2的Python,查看可安裝的Python版本后自行選擇版本,筆者安裝的是Python3.8.2
pyenv global 3.8.2#通過全局變量設置默認的python版本為3.8.2
至此,已經安裝并設置默認Python版本,至少筆者能成功解決Python3.8.2的這個問題。
7、檢查環境
(1)
pyenv version#檢查默認的python版本,如果返回以下值即成功
3.8.2 (set by /Users/username/.python-version)(2)
which python#檢查實際上能夠運行命令而不必指定的Python路徑,如果返回以下值即成功
/Users/username/.pyenv/shims/python(3)
python -V#檢查當前使用的Python版本號(注意要用大寫的V),如果返回以下值即成功
Python 3.8.2(4)
which pip#檢查實際上能夠運行命令而不必指定的pip路徑,如果返回以下值即成功
/Users/username/.pyenv/shims/pip(5)
pip -V#檢查當前使用的pip版本號(注意要用大寫的V),如果返回以下值即成功
pip 20.1.1 from /Users/username/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pip (python 3.8)pip的版本截止筆者寫完本文的最新是20.1.1,如果低于這個版本可以執行以下命令來更新。
pip install --upgrade pip重點來了!!!重點來了!!!重點來了!!!
干貨中的干貨!!!干貨中的干貨!!!干貨中的干貨!!!
這是筆者最后一個掉進的坑,免得大家也掉坑!!!
筆者翻遍各種論壇和帖子都沒有提過這一點,本來看到返回的值不一樣時簡直面如死灰,但不知道哪里來的靈感讓筆者意外操作了這一點,然后所有問題終于迎刃而解了!!!
如果以上檢查環境的其中一步或者全部返回的值并不是我們期望的,那么請你再一次執行以下命令。
source ~/.bashrc#如果用蘋果自帶的終端,請執行這個命令,使前面我們設置的所有環境變量命令生效
source ~/.zshrc#如果用iTerm2 + Oh My Zsh,請執行這個命令,使前面我們設置的所有環境變量命令生效
沒錯!!!干貨中的干貨只是再一次執行使環境變量命令生效而已!!!
隨后筆者再一次檢查環境,所有返回的值都正確了。
至此,環境已經檢查完畢了。
8、檢查tkinter模塊運行
idle#運行IDLE,如果IDLE窗口像下圖那樣沒有任何警告和以紅色字體打印的返回的值即成功
python -m tkinter -c "tkinter._test()"#運行tcl-tk測試窗口,如果看到下圖這樣的測試窗口顯示Tcl/Tk version 8.6即成功
至此,恭喜你,你已經成功正確安裝tcl-tk和Python3.8.2了!!!
筆者隨后為了驗證實際效果,在PyCharm中再一次run這段代碼:
#導入海龜繪圖模塊 import turtle t = turtle.Pen() #這是一個循壞 for x in range(360):t.forward(x)t.left(59) ''' 測試一下段注釋 '''終于可以跑這個圖形代碼了!!!
這不正是感動的感覺嗎???
簡直要哭好嗎!!!
終于可以繼續看視頻學習啦!!!
緊接而來的想法就是,筆者要記下來,不僅為了筆者自己,也為了其他可能會掉坑里的人。
于是這篇知乎文就誕生了,但也在這里結束了。
感謝前人走出來的路和經驗,解決這次的問題也參考了很多老前輩的經驗,文章末尾會列出幫助過筆者的帖子和文章。
感謝大家的耐心閱讀,希望這個方法對你有幫助。
P.S.
可以留意的事項:
1、想要成功,安裝前的環境要足夠干凈!
2、必須先安裝好tcl-tk再安裝Python!!
3、讓配置文件bashrc和zshrc生效非常重要!!!
參考資料:
西毒:iTerm2 + Oh My Zsh 打造舒適終端體驗?zhuanlan.zhihu.comMac上安裝Homebrew及常用命令?www.jianshu.comMac OS下使用pyenv管理Python版本?www.jianshu.comUnable to install tkinter with pyenv Pythons on MacOS?stackoverflow.compyenv install doesn't work with homebrew installed tcl-tk · Issue #1375 · pyenv/pyenv?github.comMacOS homebrew python 3.8.1 with tcl-tk (properly)?gist.github.comInstalled Python 3 on Mac OS X but its still Python 2.7?stackoverflow.comTkinter import error for pyenv Pythons #94?github.comPython not configured for Tk?stackoverflow.com[SOLVED] Cannot make pyenv work properly · Issue #427 · pyenv/pyenv?github.comClarify instructions in readme #481?github.compyenv/pyenv?github.com總結
以上是生活随笔為你收集整理的path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 毛利率高达54%!知网年收入超11亿上热
- 下一篇: 好吃不过饺子 好玩不过......煮饺子