前言:
笔者不过是一个刚立下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 MacOSstackoverflow.compyenv install doesn't work with homebrew installed tcl-tk · Issue #1375 · pyenv/pyenvgithub.comMacOS homebrew python 3.8.1 with tcl-tk (properly)gist.github.comInstalled Python 3 on Mac OS X but its still Python 2.7stackoverflow.comTkinter import error for pyenv Pythons #94github.comPython not configured for Tkstackoverflow.com[SOLVED] Cannot make pyenv work properly · Issue #427 · pyenv/pyenvgithub.comClarify instructions in readme #481github.compyenv/pyenvgithub.com