关于程序中遇到的import问题的整理
参考:https://www.cnblogs.com/yan-lei/p/7828871.html
https://www.cnblogs.com/kungfupanda/p/5257174.html
https://www.cnblogs.com/kungfupanda/p/5257174.html
模块(module): 一个整体的*.py文件,里面包括类,函数,变量
包(package) : 一个文件夹,在文件夹底下必须要有一个__init__.py文件,这样python才将这个文件夹看做一个包
import模块的的时候,模块中的代码会直接执行,如果不想让一段代码执行可以将代码写在 if __name__ == "__main__"条件语句下。当一个模块被多次引用的时候,模块中的代码只会执行一次
import直接引用包或者引用包下面的子包或者模块,程序都会先运行__init__.py中的代码。__init__.py中可以是一些环境配置的代码,如from . import module_name(相对引用)
1. import name1 (as name2)
2. import name1.name2... (as name3)
3. form name1 import name2 (as name3)
4. form name1.name2... import name3 (as name4)
1.2方法后import只能是包或者模块,无法将模块中的函数,类,变量引用。如果想引用一个模块中的函数,类,变量可以使用3.4方法(form moudle import function_name)
当只是import了一个包,不能直接在程序中通过 . 的方式使用包下面的模块中的函数或者子包中模块的函数(如:import package_name后 程序中直接package_name.module_name.function()会出错)使用函数必须import到相应的模块。
如果想要直接import包后可以 . 到包下相应的模块 可以在包中__init__.py 中import相应的模块
在绝对引用的时候程序寻找相应模块与包的顺序是根据sys.path中的路径的先后顺序的(相对引用与绝对引用在之后介绍)
当文件作为脚本执行的时候,*.py文件的__name__=="__main__",这是为什么如果不想让加入模块时执行代码可以将代码加在if __name__ == "__main__"条件语句下。
当文件作为模块执行的时候,*.py文件的__name__=="关于最顶层包的相对路径"(如:package1.subpackage2.module)这个时候可以根据__name__的相对路径通过 '.'(当前文件夹)'..'(上一个文件夹)'...'(上上层文件夹)...来找到相应模块的位置import(如:from .. import module,相当于在文件的上一层包中找到module文件引用),这种引用方式是相对引用。在作为脚本执行的时候,因为__name__=="__main__"不能获得文件的相对位置,所以不能通过这种方式找到文件上一级所在包的文件。