python36如何初始化PYTHONPATH?

时间:2018-06-25 22:10:54

标签: python pythonpath sys.path

两个从新安装的具有相同python36版本的相同暂存VM的sys.path值不同:

第一个虚拟机

[root@vm1 ~]# python36 -m site
sys.path = [
    '/root',
    '/usr/lib64/python36.zip',
    '/usr/lib64/python3.6',
    '/usr/lib64/python3.6/lib-dynload',
    '/usr/lib64/python3.6/site-packages',
    '/usr/lib/python3.6/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

第二个虚拟机

[root@vm2 ~]# python36 -m site
sys.path = [
    '/root',
    '/usr/lib64/python36.zip',
    '/usr/lib64/python3.6',
    '/usr/lib64/python3.6/lib-dynload',
    '/usr/local/lib64/python3.6/site-packages',
    '/usr/local/lib/python3.6/site-packages',
    '/usr/lib64/python3.6/site-packages',
    '/usr/lib/python3.6/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

由于某些原因,第二台VM具有/ usr / local / lib *路径。

两台机器上的

os.environ显示相同的变量值:

  • PYTHONPATH没有自定义路径值
  • 原始PATH变量(如果将它们连接到PYTHONPATH,则不知道) 也是一样

    [root @ vm1〜] env | grep -E“ ^ PATH =” PATH = / usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ opt / java / latest / bin:/ opt / java / latest / jre / bin:/ root / bin

当在OS端未配置PYTHONPATH的自定义值时,python36如何在初始安装期间初始化PYTHONPATH(sys.path)?

1 个答案:

答案 0 :(得分:0)

普通安装有望在没有任何PYTHONPATH环境变量的情况下运行。如文档中所述,PYTHONPATH在用户那里……

  

扩展模块文件的默认搜索路径。格式与Shell的PATH相同:一个或多个目录路径名,以os.pathsep分隔(例如Unix上的冒号或Windows上的分号)。不存在的目录将被静默忽略。

因此,没有一个标准的Python安装程序(包括在本地构建并运行make install,以及Windows和macOS二进制安装程序都可以在python.org的“下载”下找到)来创建{{1} }或在您的环境中进行设置。而且大多数半官方和第三方软件包(如Python包含或由Linux发行版和Apple打包,在Downloads / Other下不太常见的平台安装程序,“电池加” Python发行版,如Anaconda等)都可以使用。同样的方式。


请注意,PYTHONPATH目录已添加到默认搜索路径。如同一文档中所述:

  

默认搜索路径取决于安装,但通常以prefix / lib / pythonversion开头(请参见上面的PYTHONHOME)。它总是附加在PYTHONPATH上。

     

一个附加目录将被插入PYTHONPATH前面的搜索路径中,如上面“接口选项”下所述。可以从Python程序中将搜索路径作为变量sys.path进行操作。

sys.path中也对此进行了解释:

  

一个字符串列表,它指定模块的搜索路径。从环境变量PYTHONPATH初始化,再加上依赖于安装的默认值。

     

在程序启动时初始化,此列表的第一项path [0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,以交互方式调用解释器或从标准输入中读取脚本),则path [0]为空字符串,该字符串将引导Python首先搜索当前目录中的模块。请注意,由于PYTHONPATH的结果,脚本目录已插入条目之前。

     

...

     

另请参见模块site。这说明了如何使用.pth文件扩展sys.path。

PYTHONPATH不同,此PYTHONPATH机制 有时由第三方和半官方安装使用。例如,Apple使用它将site之类的Extras预安装程序包库添加到macOS上的内置Python 2.7。


如果您想知道CPython中的pyobjc模块如何加载“依赖于安装的默认值”,那么它最终可以归结为公共C API函数Py_GetPath

  

返回默认的模块搜索路径;这是根据程序名称(由上面的Py_SetProgramName()设置)和一些环境变量计算得出的。返回的字符串由一系列目录名称组成,这些目录名称由平台相关的分隔符分隔。在Unix和Mac OS X上,分隔符为':',';'在Windows上。返回的字符串指向静态存储;调用方不应修改其值。列表sys在解释器启动时使用此值进行初始化;以后可以(通常是)对其进行修改,以更改用于加载模块的搜索路径。

如果您想了解C代码的工作方式,您可能想从_PyPathConfig_Init开始,因为实际的Py_GetPath只是调用一个确保已被调用的函数,然后提取值超出了它设置的结构。