https://www.processon.com/view/link/6395b0bf1efad451e01af74d
总结:
-
导入包或模块的顺序和范围可以通过打印sys.path来查询到,通过上图的范例可以知道,通常会优先导入.py同目录和父目录下的模块或包,随后再是python安装目录中的site-packages目录下的模块或包。
p.s. 有时候明明在执行的py文件同目录放了一个包,但最后执行时,还是导入了site-packages目录下的模块或包,这是为什么哪?原因就在于__init__.py
或包中又导入了site-packages目录下的模块或包 -
导入一个模块时,如果模块中除了函数,类和变量外,也包含一些未缩进的执行语句,如print("xxx"),那么此模块被其他模块导入后,这些执行语句也会被执行。可以通过
if __name__ == "__main__":
来排除。 -
当一个文件夹的根目录,包含了
__init__.py
,这个文件夹就不是一个文件夹,而是一个Python包了。
我们可以把整个文件夹理解为一个很大的类,其中的子文件夹或.py文件是这个很大的类中的子类,再小就是这个py文件中包含的函数,类或变量了。
__init__.py
文件默认是空的。但也可以再其中导入一些其他的模块或包。
一个简单的例子:
文件结构如下:
Folder
|- __init__.py
|- filename.py
|- folder2
|- filename2.py
from folder import filename #导入filename 模块
或
from folder.folder2 import filename2 #导入filename2 模块
-
当我们自己写了一些常用模块或者包,希望自己所有其他的代码都能调用到时,除了把整个包复制到site-packages目录下之外,也可以在site-packages目录下新建一个.pth文件,并在其中指向自己常用模块或者包所在的路径。
-
from xxx import * 会导入一个模块或包下的所有函数,类或变量,但下划线开头的类,函数或变量除外。
网友评论