macOS终端中which命令与Python脚本查询Python可执行文件路径结果不一致的原因咨询
which显示的Python路径和脚本中sys.executable返回的路径不一致? 这个问题在macOS上挺常见的,核心原因在于系统自带的/usr/bin/python和/usr/bin/python3并不是直接的Python二进制可执行文件,而是包装器(wrapper)或符号链接,它们会指向系统框架或Command Line Tools中的实际Python执行文件。
1. 关于Python 2.7的情况
你看到的/usr/bin/python其实是系统提供的一个小型启动包装程序,它的作用是定位并启动位于/System/Library/Frameworks/Python.framework/Versions/2.7/下的官方Python 2.7二进制文件。当你执行python命令时,这个包装器会帮你找到真正的解释器并运行它,而sys.executable返回的正是这个实际被执行的二进制文件的路径,不是包装器本身的位置。
你可以用以下命令验证这一点:
file /usr/bin/python
输出会显示它是一个Mach-O通用可执行文件,但本质上是一个启动器,而非真正的Python解释器。
2. 关于Python 3的情况
/usr/bin/python3通常是一个符号链接,指向Xcode Command Line Tools中自带的Python 3版本。当你安装了Command Line Tools后,系统会将/usr/bin/python3链接到/Library/Developer/CommandLineTools/usr/bin/python3。which命令只会返回PATH中找到的链接路径,而sys.executable会追踪到符号链接指向的实际文件路径,所以两者显示不同。
你可以用ls -l查看这个链接关系:
ls -l /usr/bin/python3
输出会类似:
lrwxr-xr-x 1 root wheel 35 1 1 00:00 /usr/bin/python3 -> /Library/Developer/CommandLineTools/usr/bin/python3
总结
which命令的作用是在$PATH路径下查找第一个匹配的可执行文件路径,它只会返回表面的路径,不会追踪包装器的实际调用目标或符号链接的最终指向。sys.executable返回的是当前运行的Python解释器实际二进制文件的绝对路径,也就是真正在执行代码的那个程序的位置。
内容的提问来源于stack exchange,提问作者mlm

