油管看到一个非常好的视频,在这里对一些视频内的重点内容进行总结。
注:本文主要供自己复习使用,仅提供个人认为的重点内容,难免有不周到之处,如果想要详细地了解相关机制,请在油管搜索:
Python’s Import System - Module object|Regular/Namespace Packages|Finders & Loaders|Relative imports
1.__file__
如果对模块和包的__file__属性分别进行打印,结果如下:
# 包的对应路径为相应的__init__文件
/data4/hyf/project/package/__init__.py
# 模块的对应路径为对应的绝对路径
/data4/hyf/project/tool.py
2.__name__
结果如下:
# 被执行函数的__name__值
__main__
# 被导入的模块的__name__值
tool
# 被导入的包的__name__值
package
# 被导入的包内的模块的__name__值
package.module1
3.包的__init__.py文件
导入包时,该文件被自动执行,该文件的全局变量、函数,可直接通过类似package.variable
的方式进行访问。
4.导入包并不自动导入模块
若包的__init__.py
文件内不含有import submodule
(或是不含有__init__.py
),那么是不会自动导入包内的模块的,比如,若某文件中代码如下
python">import package
print(package.module)
会遇到报错:
python">AttributeError: module 'package' has no attribute 'module'
想要导入包时,也自动导入其中的模块,需要在包的__init__.py
文件中写入以下两行代码中的其中一行,这样就没有之前的报错了:
python"># 相对导入
from . import module
# 绝对导入
import package.module
或者,也可以直接使用:
python">import package.module
这样也是可以使用module
模块的
5.对第四部分机制的解释
若没有__init__.py
文件执行相对/绝对导入命令,package
对象就没有指向子模块所在内存的变量,主函数自然就无法通过package
找到package
内的module
了
6.相对导入
使用相对导入时,不能超过顶层包的路径去导入其他包或者模块。如,不能在module
内使用from .. import xxx
,因为module
只属于包package
,在package
之上,module
并不属于其他包。
此外,只有在被其他模块导入时,相对导入才能正常工作。在主文件(python直接执行的py文件)中是不能使用相对导入的。
7.使用-m参数执行模块
可以使用python -m package.module
的方式直接执行模块。如果package下有名为__main__.py
的文件,可以直接执行
python">python -m package
这等效于
python">python -m package.__main__