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

62641d4c5eb38edc4a0d0e60889d5b02.png

-------------------------------分割线-------------------------------

正文:

我们开始这次撞墙之旅吧~~~

事情的经过是这样的,笔者为了学习Python,在网上翻了很多论坛和帖子,配置好了基本环境。

笔者的环境基本是这样:

1、用Homebrew来管理软件。

2、用iTerm2 + Oh My Zsh代替苹果自带的终端。

3、用pyenv来安装管理Python版本,然后安装了Python3.8.2。

4、用PyCharm来当IDE(集成开发环境)。【懵懵懂懂的笔者看了推荐网文,也偷偷安装了VSCode来假装会用】

随后就天真烂漫地开始了Python400集的视频教程。

c4967a18b07b80bd6748cc389ed93e00.png

万万没想到!!!

到了第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 _test
    root = 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 _loadtk
    raise 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; then
  eval "$(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; then
  eval "$(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; then
  eval "$(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窗口像下图那样没有任何警告和以红色字体打印的返回的值即成功

4f80236c85b533afc6d68fced3c48728.png
python -m tkinter -c "tkinter._test()"

#运行tcl-tk测试窗口,如果看到下图这样的测试窗口显示Tcl/Tk version 8.6即成功

ba079fa763cd496d5271b9d44ca993a4.png

至此,恭喜你,你已经成功正确安装tcl-tk和Python3.8.2了!!!

笔者随后为了验证实际效果,在PyCharm中再一次run这段代码:

#导入海龟绘图模块
import turtle
t = turtle.Pen()
#这是一个循坏
for x in range(360):
    t.forward(x)
    t.left(59)
'''
测试一下段注释
'''

终于可以跑这个图形代码了!!!

b9fee2e4a30377842a1ca8a6d8ec98ee.png

这不正是感动的感觉吗???

简直要哭好吗!!!

终于可以继续看视频学习啦!!!

紧接而来的想法就是,笔者要记下来,不仅为了笔者自己,也为了其他可能会掉坑里的人。

于是这篇知乎文就诞生了,但也在这里结束了。

感谢前人走出来的路和经验,解决这次的问题也参考了很多老前辈的经验,文章末尾会列出帮助过笔者的帖子和文章。

感谢大家的耐心阅读,希望这个方法对你有帮助。

P.S.

可以留意的事项:

1、想要成功,安装前的环境要足够干净!

2、必须先安装好tcl-tk再安装Python!!

3、让配置文件bashrc和zshrc生效非常重要!!!

参考资料:

西毒:iTerm2 + Oh My Zsh 打造舒适终端体验​zhuanlan.zhihu.com
6681fc094a3ae902cdd98b64a743781e.png
Mac上安装Homebrew及常用命令​www.jianshu.com
b5599fba13c98ff6beb5131432bc10d7.png
Mac OS下使用pyenv管理Python版本​www.jianshu.com
0434441ce7603c021c1904b2fbf54827.png
Unable to install tkinter with pyenv Pythons on MacOS​stackoverflow.com
f6add196b9073396e7f88c93ff922bc6.png
pyenv install doesn't work with homebrew installed tcl-tk · Issue #1375 · pyenv/pyenv​github.com
daf4978a8da63fe08ace03c4ff3cb4d6.png
MacOS homebrew python 3.8.1 with tcl-tk (properly)​gist.github.com Installed Python 3 on Mac OS X but its still Python 2.7​stackoverflow.com
f6add196b9073396e7f88c93ff922bc6.png
Tkinter import error for pyenv Pythons #94​github.com Python not configured for Tk​stackoverflow.com
f6add196b9073396e7f88c93ff922bc6.png
[SOLVED] Cannot make pyenv work properly · Issue #427 · pyenv/pyenv​github.com
daf4978a8da63fe08ace03c4ff3cb4d6.png
Clarify instructions in readme #481​github.com pyenv/pyenv​github.com
daf4978a8da63fe08ace03c4ff3cb4d6.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值