MrT*_*rTJ 6 python macos homebrew sys pipenv
我已经用自制软件在 mac 上安装了 python。一些工具(例如 pipenv)有一些麻烦,因为它们尝试写入/lib/python3.7/site-packages/,在 mac 下是不允许的。经过一番调查,我发现他们启动了一个新的python解释器,其中发现sys.executable与自制软件安装的python路径实际上不一致。
$ which python
/usr/local/bin/python
$ python -c "import sys; print(sys.executable)"
/usr/local/opt/python/bin/python3.7
Run Code Online (Sandbox Code Playgroud)
我希望这些路径指向同一个二进制文件,为什么不是这样?我怎样才能控制sys.executable?
它是在运行时确定的(由calculate_program_full_path()in 函数Module/getpath.c确定,准确地说。它通常基于argv[0]操作系统传入的值。
您可以通过设置PYTHONEXECUTABLE环境变量来设置替代值。
然而,在自制构建上,还有更多的事情发生。Homebrew 强制问题并sys.executable直接在安装时生成的sitecustomize.py模块中 设置:
$ 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'
Run Code Online (Sandbox Code Playgroud)
PYTHONEXECUTABLE即使设置,这也会无视。
那么这是怎么回事,为什么自制软件会崩溃sys.executable?
Homebrew Python 是一个MacOS 框架构建,因此您可以使用此 Python 二进制文件运行 GUI 应用程序。框架包内的二进制文件被 Apple 置于非常严格的要求下,您可以使用它做什么,包括允许将可执行文件名称设置为什么。为了解决这些问题,框架二进制文件实际上是一个包装器),它转换为更好的路径,设置__PYVENV_LAUNCHER__环境变量并启动位于的实际python 二进制文件Resources/Python.app/Contents/MacOS/Python,然后使用__PYVENV_LAUNCHER__环境变量通知sys.executable.
包装器设置的路径在解析的目录名称中有任何符号链接。由于自制软件对/usr/local/opt/python特定的 Python 瓶子目录进行了符号链接,因此运行/usr/local/opt/python/bin/python3结果会sys.executable被设置为链接的瓶子路径:
$ /usr/local/opt/python/bin/python3 -S -c 'import sys; print(sys.executable)'
/usr/local/Cellar/python/3.7.0/bin/python3
Run Code Online (Sandbox Code Playgroud)
这违背了符号链接的目的,并且每次自制软件对 Python 公式进行次要版本更新时,都会导致安装 pip 的脚本损坏。
我希望自制软件至少检查是否PYTHONEXECUTABLE在此处设置。您可以通过直接设置来自己强制问题sys.executable:
import os, sys
if 'PYTHONEXECUTABLE' in os.environ and :
sys.executable = os.environ['PYTHONEXECUTABLE']
Run Code Online (Sandbox Code Playgroud)
我打开了一份报告,请求自制 Python 公式检查PYTHONEXECUTABLE并包含建议的修复。该修复程序已于 2018 年 11 月 28 日发布,因此只需更新您的 Python 包即可获得新版本,并使 Homebrew PythonPYTHONEXECUTABLE再次获得荣誉。
| 归档时间: |
|
| 查看次数: |
2844 次 |
| 最近记录: |