代码之家  ›  专栏  ›  技术社区  ›  MrTJ

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

  •  0
  • MrTJ  · 技术社区  · 6 年前

    我已经用自制软件在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
    

    我希望这些路径指向相同的二进制文件,为什么不是这样呢?我怎么控制

    1 回复  |  直到 6 年前
        1
  •  9
  •   Martijn Pieters    5 年前

    calculate_program_full_path() function in Module/getpath.c ,准确地说。它通常基于 argv[0] OS传入的值。

    可以通过设置 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'
    

    这就轻率地忽略了 蟒蛇 即使设定了。

    那么到底是怎么回事,为什么自制啤酒会轰动一时呢 ?

    自制Python是一个 MacOS framework build ,因此可以使用此Python二进制文件运行GUI应用程序。苹果对框架包中的二进制文件提出了非常严格的要求,包括允许将可执行文件名设置为什么。为了解决这些问题,二进制框架实际上是一个 wrapper )这意味着要走一条更好的路 __PYVENV_LAUNCHER__ 实际的 Resources/Python.app/Contents/MacOS/Python ,然后使用 要通知的环境变量 系统可执行文件 .

    包装器设置的路径有任何符号链接 在目录名中 /usr/local/opt/python 指向特定Python瓶子目录的符号链接,运行 /usr/local/opt/python/bin/python3 结果 系统可执行文件

    $ /usr/local/opt/python/bin/python3 -S -c 'import sys; print(sys.executable)'
    /usr/local/Cellar/python/3.7.0/bin/python3
    

    这违背了symlink的目的,每次自制程序对Python公式进行小版本更新时,都会导致pip安装的脚本损坏。

    检查是否 蟒蛇 在这里你可以通过设置 系统可执行文件 直接:

    import os, sys
    
    if 'PYTHONEXECUTABLE' in os.environ and :
        sys.executable = os.environ['PYTHONEXECUTABLE']
    

    我打开了一份报告 to request the homebrew Python formula checks for PYTHONEXECUTABLE included a suggested fix . 修复程序于2018年11月28日发布,因此只需更新Python包就可以获得新版本,并使自制Python获得荣誉 蟒蛇 再一次