发布时间:2022-04-12 09:49:14 人气:277 作者:多测师
导入模块时除了使用模块名进行导入,还可以使用目录名进行导入。例如,在sys.path路径下,有一个dir1/dir2/mod.py模块,那么在任意位置处都可以使用下面这种方式导入这个模块。
import dir1.dir2.mod
from dir1.dir2.mod import XXX
一个实际一点的示例,设置PYTHONPATH环境变量为d:\pypath,然后在此目录下创建以上目录和mod.py文件:
set PYTHONPATH="D:\pypath"
mkdir d:\pypath\dir1\dir2
echo print("mod.py") >d:\pypath\dir1\dir2\mod.py
echo x=3 >>d:\pypath\dir1\dir2\mod.py
# 进入交互式python
>>> import dir1.dir2.mod
mod.py
>>> dir1.dir2.mod.x
3
注1:在python3.3版本及更高版本是可以导入成功的,但是在python3.3之前的版本将失败,因为缺少__init__.py文件,稍后会解释该文件
注2:顶级目录dir1必须位于sys.path列出的路径搜索列表下
如果输出dir1和dir2,将会看到它们的是模块对象,且是名称空间。
>>> import dir1.dir2.mod
mod.py
>>> dir1
>>> dir1.dir2
>>> dir1.dir2.mod
这种模块+名称空间的形式就是包(严格地说是包的一种形式),也就是说dir1是包,dir2也是包,这种方式是包的导入形式。包主要用来组织它里面的模块。
从上面的结果也可以看出,包也是模块,所以能使用模块的地方就能使用包。例如下面的代码,可以像导入模块一样直接导入包dir2,包和模块的区别在于它们的组织形式不一样,模块可能位于包内,仅此而已。
import dir1.dir2
from dir1 import dir2
另外,导入dir1.dir2.mod时,它声明的模块变量名为dir1,而不是dir1.dir2.mod,但是导入的对象却包含了3个模块:dir1、dir1.dir2以及dir1.dir2.mod。如下:
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'dir1']
>>> for key in sys.modules:
... if key.startswith("dir1"):
... print(key,":",sys.modules[key])
...
dir1 :
dir1.dir2 :
dir1.dir2.mod :
以上内容为大家介绍了Python包导入格式,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/