python包/模块,专栏总目录:
1、python解释器默认搜索路径
出于性能考虑,每个模块在每个解释器会话中只导入一遍。因此,如果你修改了你的模块,需要重启解释器或者如果你就是想交互式的测试这么一个模块,可以用 reload() 重新加载,例如 reload(modulename)。
1.1、当前工程加载顺序
1)导入一个叫 spam 的模块时,解释器先在当前目录中搜索名为 spam.py 的文件,import语句时导入spam.py,顺序执行其中代码。
目录结构:
project/
test.py # 工程主函数所在文件
spam.py # 包spam,文件内容:print("logs: import spam.py")
# test.py
import spam
=> logs: import spam.py
2)同时添加spam包,则优先调用包,spam被屏蔽。
project/
test.py # 工程主函数所在文件
spam.py # 包spam,文件内容:print("logs: import spam.py")
spam/
__init__.py # print("logs: import spam package.")
pa.py # print("logs: import spam.pa.py")
test.py中,import spam,加载包spam中__init__.py文件内容,执行结果:
logs: import spam package.
import spam.pa,先加载spam包__init__.py,再加载spam.pa.py中内容,执行结果:
logs: import spam package.
logs: import spam.pa.py
结论:
import某个文件时,会在第一次加载该文件,顺序执行其中内容。若当前工程中,自定义包名与文件名重名,则该重名文件被覆盖,加载包。导入某个包下的子文件时,首先导入该包,依次从根到子文件加载。
1.2、工程之外的包加载顺序
如果当前工程没有找到的话,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中。sys.path 变量的初始值来自如下:
1)输入脚本的目录(当前目录);
2)环境变量 PYTHONPATH 表示的目录列表中搜索;
3)Python 默认安装路径中搜索。
>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
添加自己目录两种方法:
1)直接修改sys.path变量,添加要搜索的目录;
>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')
这种方法是在运行时修改,运行结束后失效。
2)设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。
注:自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。
1.3、加载顺序
解析时,按照sys.path中提供的路径,依次进行解析。调整目录顺序,可提高库的优先级(已测);
默认情况下,当前工程自定义包->文件->系统路径,顺序加载。
自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。