【7000字超详细笔记】在使用M系列芯片的Mac上搭建合理的python开发情况 ...

打印 上一主题 下一主题

主题 963|帖子 963|积分 2889

在使用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
  1. usr_name@Device_name ~ % where python3
  2. /Library/Frameworks/Python.framework/Versions/3.9/bin/python3
  3. /usr/local/bin/python3
  4. /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:
  1. usr_name@Device_name ~ % where python3
  2. /Library/Frameworks/Python.framework/Versions/3.9/bin/python3   # 新安装的python路径1
  3. /usr/local/bin/python3  # 新安装的python路径2
  4. /usr/bin/python3        # 系统自带的python路径
复制代码
如果没有观察到相应路径,可是是情况变量的设置问题;通常来讲安装乐成,.zprofile 会被自动改写(改写前的内容也会备份),情况变量也会被自动设置,所以不用担心这个问题。如果 .zprofile 中没有如下图后四行的内容,则手动添加(vim ~/.zprofile):

并且,由于 .zprofile已经做了正确配置,所以当终端打开时,默认的python也会是新安装的python,使用 which python3 (差别于 where python3,which python3是检察当前终端被调用的python3路径,只有唯一一个)检察,显示的应该是新安装的python路径:
  1. usr_name@Device_name ~ % which python3
  2. /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上都有人提到,并且提供了一些解决方法。不外比起解决这个问题,我更想表明这个问题。
我们来看完整的报错信息:
  1. usr_name@Device_name ~ % pip install --upgrade pip
  2. Defaulting to user installation because normal site-packages is not writeable
  3. 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就被默认指定在了用户目录下,天然没了报错;但似乎又徒增的打字的麻烦,大概并不必要,毕竟殊途同归。
  1. usr_name@Device_name ~ % pip install --user --upgrade pip
  2. 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,来验证一切都按我们想要的进行:
  1. usr_name@Device_name ~ % where python3
  2. /Library/Frameworks/Python.framework/Versions/3.9/bin/python3   # 新安装的python路径1
  3. /usr/local/bin/python3  # 新安装的python路径2
  4. /usr/bin/python3    # 系统自带的python路径
  5. usr_name@Device_name ~ % where pip3
  6. /Users/pal/Library/Python/3.9/bin/pip3  # 用户site-packages安装的pip
  7. /usr/bin/pip3   # 系统自带的pip
  8. usr_name@Device_name ~ % which python3  
  9. /Library/Frameworks/Python.framework/Versions/3.9/bin/python3   # 终端使用的是新安装的python而不是系统自带的
  10. usr_name@Device_name ~ % which pip3   
  11. /Users/pal/Library/Python/3.9/bin/pip3  # 终端使用的是用户site-packages下安装的pip,并且用户site-packages中安装的可执行文件(asitop等)能被正确找到
  12. usr_name@Device_name ~ % pip install --upgrade pip
  13. Defaulting to user installation because normal site-packages is not writeable   # 无需解决的报错
  14. Requirement already satisfied: pip in ./Library/Python/3.9/lib/python/site-packages (24.2)  # 所有修改都在用户目录下,而不会干扰系统运行
复制代码
如果你运行以上指令也得到了相同的输出,那么恭喜你,拥有了一个合理有序的mac os的python情况~
(ps:每次更改.zshrc大概.zprofile文件,请记得重启终端大概运行 source+文件名 使得新配置得以被运行)
以上,希望这篇文章能帮助你更有序地构建你的mac开发情况,同时如果文章中有任何不对的地方,欢迎指正qwq。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表