我已经在Mac上用自制软件安装了python。某些工具(例如pipenv)有一些麻烦,因为它们尝试写入/lib/python3.7/site-packages/
,这在Mac中是不允许的。经过一番调查,我发现他们启动了一个在sys.executable
中发现的新python解释器,该解释器实际上与自制软件安装的python路径不一致。
$ which python
/usr/local/bin/python
$ python -c "import sys; print(sys.executable)"
/usr/local/opt/python/bin/python3.7
我希望这些路径指向相同的二进制文件,为什么不是这样呢?如何控制sys.executable
?
答案 0 :(得分:2)
确切地说,它是在运行时确定的(由calculate_program_full_path()
function in Module/getpath.c
确定。通常是基于操作系统传入的argv[0]
值。
您可以通过设置PYTHONEXECUTABLE
environment variable来设置替代值。
但是,在自制软件上,还有更多工作要做。自制程序会强制执行此问题,并将sys.executable
直接设置在sitecustomize.py
module generated at install time中:
$ tail -n2 /usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sitecustomize.py
# Set the sys.executable to use the opt_prefix
sys.executable = '/usr/local/opt/python/bin/python3.7'
即使设置了此键,它也会忽略PYTHONEXECUTABLE
。
这是怎么回事,为什么自制酒sys.executable
?
Homebrew Python是MacOS framework build,因此您可以使用此Python二进制文件运行GUI应用程序。 Apple对框架束中的二进制文件提出了非常严格的要求,包括如何使用它,包括允许将可执行文件名设置为什么。要解决这些问题,框架二进制文件实际上是wrapper ),它可以转换为更好的路径,设置__PYVENV_LAUNCHER__
环境变量,并启动位于{{ 1}},然后使用Resources/Python.app/Contents/MacOS/Python
环境变量通知__PYVENV_LAUNCHER__
。
包装器设置的路径在目录名称中的任何符号链接 已解析。由于自制程序使sys.executable
成为指向特定Python瓶子目录的符号链接,因此运行/usr/local/opt/python
会导致/usr/local/opt/python/bin/python3
被设置为链接的瓶子路径:
sys.executable
违反了符号链接的目的,并且每次自制软件对Python公式进行次要版本更新时,都可能导致损坏的pip安装脚本。
我希望自制软件至少在这里检查是否设置了$ /usr/local/opt/python/bin/python3 -S -c 'import sys; print(sys.executable)'
/usr/local/Cellar/python/3.7.0/bin/python3
。您可以直接设置PYTHONEXECUTABLE
来自己强行解决问题:
sys.executable
我已经打开了一个报告to request the homebrew Python formula checks for PYTHONEXECUTABLE
和included a suggested fix。