在使用M系列芯片的Mac上搭建合理的python开发环境
0. 前情提要
刚入手Macbook时候就了解到在Macbook上配置python会稍微有点麻烦,主要是因为系统自带了python,而且不少系统功能需要python支持;因此乱改自带python的环境,可能会造成意想不到的后果。所以网上的大神们也都建议不要使用mac自带的python。
不过现在回想起来,我当时并没有太在意这个事情,因为在win上开发python的经验告诉我,conda(虚拟环境)才是最优解,毕竟谁也不想把python装的“到处都是",把环境变量弄得”乱七八糟"。所以对于会用anaconda的我来说,系统自带的python本来也不会被使用到,我也并没有必要安装自带的python以外的其他python。
不过事实证明,我在日常使用系统自带的python环境的频率非常高,一方面可以快捷的在命令行调用python完成一些科学计算,另一方面有一些很好用的小工具(例如m系列芯片专享的性能检测工具asitop,还有数据标注工具label-studio)也是基于python构建的,可以通过pip安装。
所以不知不觉,我在系统自带的python环境下,也安装了不少第三方库,这也许是不好的行为(毕竟修改了系统自带的python环境),但是我并没有遇到什么问题,所以也还无感。
直到最近更新了macos15,在一次
pip install --upgrade pip
(实际上我运行任何pip操作,都会有此提示)操作中观察到了意想不到的提示(Defaulting to user installation because normal site-packages is not writeable),这让我感到一丝不安。
虽然我也搞不清楚这样的报错信息,是一直都有,还是更新完新系统才有(后者的可能性似乎更大些,因为关于这条报错,CSDN上有人评价过这种情况确实多发于更新新系统之后);虽然这条信息看起来人畜无害,但如果不能解决或者弄清楚原因,始终让人感到不安。
因此最近忙里偷闲找时间梳理了mac上安装python的多种情况,同时也对这个报错信息的来源有了眉目,做个笔记记录下。笔记很多的观点只是个人猜想,并没有做严谨考证,欢迎大神指出错误。
1. 先说结论
如果你是M系列芯片的Mac电脑(我认为这点很重要,因为在搜索有关mac如何配置python的教程中,无论在CSDN还是Stack Overflow等平台,即使有一些很新的帖子,讨论的也还是基于Intel芯片的Macbook,这些老mac的系统版本甚至还是上古的OS X;而实际上目前很大一部分Mac用户使用的已经是基于M系列芯片的电脑了,但这两者在配置python方面有一定的区别),也就是说你的电脑自带的已经是python3(而不是老mac自带的python2),那么你电脑里的python也许应该这样配置,也就是有以下三类适用于不同场景的python:
- 系统自带的python(用于保障系统功能正常运行的python(版本似乎是3.9.6),平常不要去使用它,更不要更改它的环境)
- 自己下的python(非虚拟环境,不需要每次conda activate再使用,是terminal(终端)一打开默认使用的python,它可以是任何版本(取决于你需要用什么版本),为你的日常使用提供支持(比如下载一些好用的小插件)
- 编程开发用的python(虚拟环境,主要是编程开发时配合ide所使用的,往往有面向不同项目的多个虚拟环境,提供不同版本的python,和对应的package库)
一些详细的事项在下面展开说说。
2. 展开说说
2.1 系统自带的python
终端里输入
where python3
,显示在路径
/usr/bin/python3
下的应该就是系统自带的python;在没有安装其他python并且修改对应环境变量时,终端调用的就是这里的python
usr_name@Device_name ~ % where python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
/usr/local/bin/python3
/usr/bin/python3 # 系统自带的python路径
如果是老版本mac,自带的则是python(也就是python2)。这里的python3版本还算比较新,也够日常使用;但为了避免修改系统python环境的可能(尽管这个环境是受到保护的),所以我们还是自己下一个python,用起来更放心。
2.2 自己下的python
可以直接到官网下载:Python Release for macOS
似乎并不是所有版本都能下载的,带有下载器链接,且名称为Download macOS 64-bit universal2 installer的版本(这里贴出的是3.12.7的链接)才能下载,这些版本是支持M系列芯片的。下载pkg文件后,正常安装即可。
不过不知道为什么在安装的时候无法修改“安装卷宗”,只能默认路径安装(否则我认为安装到用户目录下也许是更加合理的),安装后重启终端并再次使用
where python3
查看,发现有两个新的python3路径(不过为啥会有两个路径?),这就是我们安装的python:
usr_name@Device_name ~ % where python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 # 新安装的python路径1
/usr/local/bin/python3 # 新安装的python路径2
/usr/bin/python3 # 系统自带的python路径
如果没有观察到相应路径,可是是环境变量的设置问题;通常来讲安装成功,
.zprofile
会被自动改写(改写前的内容也会备份),环境变量也会被自动设置,所以不用担心这个问题。如果
.zprofile
中没有如下图后四行的内容,则手动添加(
vim ~/.zprofile
):
并且,因为
.zprofile
已经做了正确配置,所以当终端打开时,默认的python也会是新安装的python,使用
which python3
(不同于
where python3
,
which python3
是查看当前终端被调用的python3路径,只有唯一一个)查看,显示的应该是新安装的python路径:
usr_name@Device_name ~ % which python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 # 只显示新安装的python路径1
如此一来,我们就可以放心的在新安装的python环境下安装一些小工具了,比如前文提到的asitop。因为手动添加的环境变量优先级更高,所以也不用担心每次默认使用的python是系统自带的python。
2.3 编程开发用的python
这就没什么好说的了,csdn上有很多教程,强烈大家在编程时候使用虚拟环境,这样可以避免不同项目之间的package冲突,也可以避免修改系统环境变量。
最后在IDE中可以有如下效果:
前四个标识为Conda的是虚拟环境,不同的python适用于不同的编程需求;倒数第二个是系统自带的python,用于保障系统功能的正常运行;最后一个是自己下载的python,用于满足日常在终端中的使用需求。
一切都井井有条,完美!
3. 可能出现的问题
讲了半天,还是没有说到“前情提要"部分的报错到底是为什么,下面我们就来讲讲可能存在的问题以及解释。
3.1 Defaulting to user installation……报错提示
关于这个报错,CSDN和Stack Overflow上都有人提到,并且提供了一些解决方法。不过比起解决这个问题,我更想解释这个问题。
我们来看完整的报错信息:
usr_name@Device_name ~ % pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./Library/Python/3.9/lib/python/site-packages (24.2)
结果上来讲,我们有两个存放python包的地方,一个是系统路径下的site-packages(也就是提示不可写的normal site-packages),另一个则是用户路径下的site-packages。
我们逐个考察这些路径下都有什么东西:
- 首先看看用户路径(
./Library/Python/3.9/lib/python/site-packages
)下有什么东西,毕竟这个路径是直接给出的:可以看到,我们直接在终端下,以普通用户(非sudo)权限安装的package全部都在这里,也包括asitop、label-studio等工具。 - 然后是系统路径下的site-packages,这个路径并没有给出,但我们可以尝试把原来路径中
~
换成/
,找到一种可能的路径是/Library/Python/3.9/site-packages
,我们来看看这个路径下有什么东西:几乎什么都没有!看起来这个就很有可能是受到保护的系统python的库路径,这个地方我们还是最好不要去动它。
再回到这个问题,为什么会产生Defaulting to user installation……的报错呢?一种可能的解释是,我们使用的python(也就是新安装的
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
或者
/usr/local/bin/python3
)在根目录下而非用户目录下,因此在安装package时,会优先安装到根目录下的site-packages,而以普通用户权限这个路径是不可写的,所以就会提示相关信息;但实际上库也是安装成功的,只是安装到了用户路径下。而这其实这也恰恰是我们想要的——我们希望用户的行为改变的只是用户目录下的文件,而不是系统目录下的文件,从而不影响系统的正常运行。
总结来说,这里的报错并不是什么不好的事情,相反,它指示出系统正在保护自身运行所需要的环境,而将所有更改限定在用户路径下。最后的效果就是,即使有多个用户使用这台计算机,并使用同一个根目录下的python,所调用的依然是自己用户目录下的site-packages,彼此互不干扰,也不影响系统运行的环境。
综上,这其实是一个不用解决的问题。
但网上依然提出一些解决方案,这里小小评价下:
- 调用
pip
命令时增加--user
参数,这样site-packages就被默认指定在了用户目录下,自然没了报错;但似乎又徒增的打字的麻烦,也许并不必要,毕竟殊途同归。
usr_name@Device_name ~ % pip install --user --upgrade pip
Requirement already satisfied: pip in ./Library/Python/3.9/lib/python/site-packages (24.2)
- 使用sudo权限运行,实际上这样操作你会触发更多的报错(报警)信息 最后我们也还只是把package装到了用户目录下的site-packages,同时从提示信息我们也看到,不去修改根目录的site-packages(系统运行依赖的环境),是多么正确的做法。
- 还有一些其他解决方法,但可能会更改系统的设置,这里也就不再尝试了。
3.2 pip install已经显示装好的软件,为什么用不了?
现在我们安装asitop试试手,根据下图的提示,我们成功把asitop安装到了我们自己的site-packages(也就是用户目录下)下,一切都按预期的进行。可是我们想要运行asitop时,却又提示无法找到命令:
这是因为用户目录下的site-packages没有被添加到环境变量中去。换句话说,当python运行时,它能找到用户目录下的site-packages,并提供相应的库功能;但对于asitop、label-studio这些工具,它们并不是python库,而是一些依赖python并可以通过pip安装命令行工具(本质是一个可执行文件),所以无法在终端中直接被找到,需要添加环境变量。
实际上,这些工具和一般的site-packages在基本相同的路径下,只不过是在bin目录下(可执行文件),只要添加环境变量即可,这里我在
.zshrc
中添加了如下内容,这样每次启动终端,也能直接输入名字就可以调用asitop、label-studio这些工具:
需要说明的是,这里显示的
~/Library/Python/3.9/bin
并不意味着用户目录下也新装了一个python,而是用户目录下的site-packages中的可执行文件所在的路径,打开后可以发现并没有可执行文件python3,而是asitop、label-studio、ipython等工具,真正运行的python还是安装在根目录下的python(运行
which python3
可以看到)。
4. 总结
最后我们用一连串的where、which,来验证一切都按我们想要的进行:
usr_name@Device_name ~ % where python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 # 新安装的python路径1
/usr/local/bin/python3 # 新安装的python路径2
/usr/bin/python3 # 系统自带的python路径
usr_name@Device_name ~ % where pip3
/Users/pal/Library/Python/3.9/bin/pip3 # 用户site-packages安装的pip
/usr/bin/pip3 # 系统自带的pip
usr_name@Device_name ~ % which python3
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 # 终端使用的是新安装的python而不是系统自带的
usr_name@Device_name ~ % which pip3
/Users/pal/Library/Python/3.9/bin/pip3 # 终端使用的是用户site-packages下安装的pip,并且用户site-packages中安装的可执行文件(asitop等)能被正确找到
usr_name@Device_name ~ % pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable # 无需解决的报错
Requirement already satisfied: pip in ./Library/Python/3.9/lib/python/site-packages (24.2) # 所有修改都在用户目录下,而不会干扰系统运行
如果你运行以上指令也得到了相同的输出,那么恭喜你,拥有了一个合理有序的mac os的python环境~
(ps:每次更改.zshrc或者.zprofile文件,请记得重启终端或者运行 source+文件名 使得新配置得以被运行)
以上,希望这篇文章能帮助你更有序地构建你的mac开发环境,同时如果文章中有任何不对的地方,欢迎指正qwq。
版权归原作者 你喜欢吃过桥米线吗? 所有, 如有侵权,请联系我们删除。