-
模块
一个 .py文件就是一个模块 -
包
一个包下必须有__init__.py文件(python2必须有,python3可以没有),此文件标志着当前文件夹是一个包(package)。
此文件也是一个模块,其模块名字就是顶层包到当前目录的点路径。
比如,A/B/C,A为顶层包,B为中层包,C为底层包,此时C包中的__init__.py模块的名字为A.B.C而并不是其自身的__init__。 -
模块作为入口文件和包时的名称不一样
模块作为入口文件的时候,其模块名字会被指定为__main__;当模块作为被导入的部分的时候,模块名字就是.py文件不带后缀的名字。这也就是为什么在模块中写if条件语句判断__name__是否等于__main__,条件成立的情况下才进行脚本的执行。否则,如果另一个模块中也有可执行语句,那么导入整个模块之后,被导入模块的脚本也会执行,破坏程序。 -
两种导模块的方法
规则的,入口模块应该在最顶层,而后导入其他包,或者其他包中的函数。
当需要导入的模块的路径难找时,可以先导入sys模块,而后使用sys.path.add(“xxx”)(xxx可以是绝对路径,相对路径),此作用是把xxx路径临时添加到搜索路径。之后就可以正常地导入该路径下模块了。 -
导入的方法
xxx为包,yyy是此包中的模块
直接导入整个模块:
import xxx.yyy
导入模块中具体函数:
import xxx.yyy.func
从一个包中导入一个模块:
from xxx import yyy
从一个模块中导入一个函数:
from xxx.yyy import func -
.py文件的__name__属性和__package__属性
若一个.py文件被当作入口文件执行,此时文件的__name__属性为__main__而__package__属性为None。但是使用路径导入模块的时候,python需要借助当前文件的__name__和__package__属性来寻找包路径,所以当一个.py被当作入口文件的时候,是无法借助相对路径或者绝对路径来寻找包路径的。
因此,需要将入口文件放在工程的顶级目录。
作为模块被导入的时候,此模块中的脚本不会执行。 -
包中包模块导入
大包中包含很多小包,小包中的模块有引用关系。
一个模块引用另一个模块,要用from xxx import xxx格式。
即使再同一个包中的模块,也不能用import直接导入,因为import只会搜索系统路径中的包的位置。
from xxx import xxx中,from后的路径需要从最大的包开始。
比如
A/B/C/demo.pyA/B/C/tools.py
A/B/test.py
A/B/C/D/last.pydemo.py导入其他三个模块的时候
可以如下两种方式方式一:绝对路径
import A.B.C.tools import A.B.test import A.B.C.D.last 或者 from A.B.C import tools from A.B import test from A.B.C.D import last
方式二:相对路径
#相对路径只能使用form xxx import xxx语句 from . import tools from ..B import test from .D import test
两个例外:
在包中不能导入顶层目录中的模块。
在工程顶层,和入口文件同级的模块可以被import直接导入入口文件。 -
如何导入__init__模块?
直接导入对应的包名就可以。
如:
A/B/C/init.py
此时想导入C下的__init__模块,只需要:
import A.B.C
或者
from A.B import C
就可以了但是对于模块自己所在的包,如果这个包在顶层,则无法使用from xxx import xxx语句导入。
只能使用import xxx直接导入。
如:
A/demo.py
A/init.py
在demo.py中只能这样书写:import A
而不能这样写
from . import A 或者 from A import A
python导包
最新推荐文章于 2024-04-19 11:24:42 发布