sys.executable如何确定解释器路径?

时间:2018-11-07 12:05:49

标签: python macos homebrew sys pipenv

我已经在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

1 个答案:

答案 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 PYTHONEXECUTABLEincluded a suggested fix

相关问题