Python笔记关于环境安装(二)模块的查找
笔记要点
python从哪里查找模块:当前启动python的目录,python安装目录下的某几个目录和.zip文件,第三方模块所在目录site-package,最后是我们自己添加到sys.path的目录。
模块查找
就像吩咐人做事一样,要先找到人才可以让他做事。Python解析器要执行代码,同样要先找到代码才行。Python解析器在执行代码的时候是从哪里找呢?以下内容引用自Python官方文档。
当一个名为 spam 的模块被导入的时候,解释器首先寻找具有该名称的内置模块。如果没有找到,然后解释器从sys.path变量给出的目录列表里寻找名为 spam.py 的文件。sys.path初始有这些目录地址:上面所描述的是默认情况下的启动python解释器时由python自动填充的sys.path的值。
1.在开始时,添加一个空条目,该条目对应于当前目录。
2.如果环境变量PYTHONPATH存在,如环境变量中所述,则接下来添加其条目。请注意,在Windows上,此变量中的路径必须用分号分隔,以区别于驱动器标识符中使用的冒号( C:\ 等)。
3.附加的 "application paths" 可以同时添加到注册表` HKEY_CURRENT_USER` 和 HKEY_LOCAL_MACHINE 分支下的:samp:\SOFTWARE\Python\PythonCore\{version}\PythonPath 中作为子键。以分号分隔的路径字符串作为默认值的子键将导致每个路径添加到sys.path。(请注意,所有已知的安装程序都只使用HKLM,因此HKCU通常为空。)
4.如果设置了环境变量PYTHONHOME,则将其假定为 “Python 主目录” 。否则,主Python可执行文件的路径用于定位 “landmark 文件” ( Lib\os.py 或 pythonXY.zip )以推断 ”Python 主目录“ 。如果找到了Python主目录,则基于该文件夹将相关的子目录添加到sys.path(Lib , plat-win 等)。否则,核心Python路径是从存储在注册表中的PythonPath构造的。
5.如果找不到Python Home,也没有指定PYTHONPATH环境变量,并且找不到注册表项,则使用具有相对条目的默认路径(例如 .\Lib; .\plat-win 等等)。
在初始化后,Python程序可以更改 sys.path。包含正在运行脚本的文件目录被放在搜索路径的开头处, 在标准库路径之前。这意味着将加载此目录里的脚本,而不是标准库中的同名模块。 除非有意更换,否则这是错误。更多信息请参阅 标准模块。
官方文档地址:
python官方安装教程之查找模块
python官方教程之模块
另外:默认情况下,python解释器在初始化启动时会自动导入site模块,这个模块也会添加一些特定的路径到sys.path中,这个site模块是用python源码实现的,查看源码内的注释:“Append module search paths for third-party packages to sys.path",应该是说添加第三方模块搜索路径到sys.path中,主要就是添加site-package这个目录。
这个模块将在初始化时被自动导入。 此自动导入可以通过使用解释器的 -S 选项来屏蔽。导入此模块将会附加域特定的路径到模块搜索路径并且添加一些内建对象,除非使用了 -S 选项。在此例中,模块可以被安全地导入,而不会对模块搜索路径和内建对象有自动的修改或添加。要明确地触发通常域特定的添加,调用函数 site.main()。
python标准库之site模块
要点:python也给我们提供了自定义进行覆盖默认sys.path的方式,通过自定义sys.path的方式,我们可以限制python程序加载运行时所能搜索的路径,可以隔离不同应用让它们有不同搜索路径,自定义的方式很适合在我们将python嵌入到我们自己的应用程序的时候,这样做我们应用内的python不会跟用户系统本身已存在的python环境冲突,导致出现问题。具体的可以查看上面给出的官方的文档。
关于sys.path取值的测试 根据上面官方关于sys.path取值情形的描述:
1,空格,表示当前目录。
2,我没有设置PYTHONPATH环境变量,这一点我没有。
3,安装python应用环境时的注册表信息,这个我查了下,我有HKCU,没有找到HKLM。(我想这是因为我是选择默认安装到当前用户路径的原因),这个的注册表项有两个值,分别指向DLLs和Lib目录。
文章图片
HKCU 4,这里的描述看不大明白,但是结合结果看,主要是围绕python安装的主目录,添加python安装主目录下的几个路径到sys.path中。pythonXX.zip文件路径,Lib目录等,感觉有些点跟第3点重复了。
5,跟第四一样,只是在找不到主目录的情形下,路径都变成了相对路径。这里我的不属于这种情形。
所以,我只有1,3,4点。
启动环境验证 我启动python环境,打印了下这个sys.path的值,我的python安装目录是:C:\Users\Administrator\AppData\Local\Programs\Python\Python37。打开cmd命令,目前是在 C:\Users\Administrator 目录下,在这个目录下我还有个testsite.py 模块文件,里面只有一句print()代码。
现在启动python交互式命令环境:
文章图片
我在site模块的源码里面添加了一些打印代码,从图中可看到开始加载site模块的开头打印的路径信息,和加载完site模块的打印路径信息看,第三方模块所在的site-package目录是site模块添加的。其他的几个路径信息符合3,4点所描述的。
【Python笔记关于环境安装(二)模块的查找】['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
修改sys.path 1.我们可以在代码里面直接添加我们要搜索的路径信息到sys.path中。
2.python官方所说的通过自定义一个._pth 文件的方式,完全覆盖默认的sys.path。
3. python 命令行有几个选项:-E -s -S -I ,这些可以分别禁用某些路径被写入到sys.path。
如-E ,忽略所有 PYTHON* 环境变量,例如可能已设置的 PYTHONPATH 和 PYTHONHOME。
要点:有时候,我们自己写的代码出现找不到模块时,很可能就是因为我们写的模块所在的路径不在sys.path中,导致解释器搜索不到。可以打印下sys.path看看是否这样。
来我的小店逛逛吧
文章图片
时尚内衣家居服
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- python学习之|python学习之 实现QQ自动发送消息
- 四首关于旅行记忆的外文歌曲
- Android中的AES加密-下
- 逻辑回归的理解与python示例
- 醒不来的梦
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- 【读书笔记】贝叶斯原理