模块(module):xx.py 可以理解为模块就是一个py文件
包(package):可以理解 就是一个文件夹,文件夹中含多个py文件
注意:在包(文件夹)中有一个默认内容为空的`__init__.py`的文件,一般用于描述当前包的信息(在导入他下面的模块时,也会自动加载)。
- py2必须有,如果没有导入包就会失败。
- py3可有可无。
例子:
我的项目路径
当程序运行时,python 解释器 会在程序执行入口文件的当前目录查询导入包和模块的路径 ,例子中run.py是我的程序执行入口
故,执行run时,导入包和模块的路径会优先在demo 目录下查找:
通过内置模块sys 获取这个路径:
import sys curr_path =sys.path print(curr_path) '''输出,其中特别注意: 使用pycharm运行代码时会自动将项目的根目录加到sys.path目录中,我这里的项目的根目录是D:\\pythonProject\\PyDemo''' #['D:\\pythonProject\\PyDemo\\DemoFile\\模块和包', # 'D:\\pythonProject\\PyDemo', # 'D:\\Python\\python38.zip', # 'D:\\Python\\DLLs', # 'D:\\Python\\lib', # 'D:\\Python', # 'D:\\Python\\lib\\site-packages', # 'D:\\Python\\lib\\site-packages\\win32', # 'D:\\Python\\lib\\site-packages\\win32\\lib', # 'D:\\Python\\lib\\site-packages\\Pythonwin']
如果要导入 其他项目目录下的 包或者模块 需要 在sys.path中添加对应模块和包所属的路径:
import sys sys.path.append(path) #path为对应包或者模块所属的路径
3、导入模块和包
导入一个模块 (一般多用于导入sys.path目录下的一个py文件)
'''import 方式导入模块''' # import 方式导入(从根目录路径开始导入) # 导入一个read1模块,通过该模块可以调用模块中的所有函数 # import demo.bin1.read_1 # demo.bin1.read_1.read_bytes() # demo.bin1.read_1.read_text() # import 方式导入(模块在根目录,直接导入) # import read_1 # read_1.read_text() # import 方式导入(从子包中导入模块) # import demo.bin1.bin2.write1 # # demo.bin1.bin2.write1.write_text() # demo.bin1.bin2.write1.write_bytes()
一般用于路径多层嵌套导入,或者导入某个模块中的函数:
'''from...import... 方式导入模块''' # 导入模块中的所有函数 (根目录模块) # from module1 import * # m1() # m2() # 导入模块中指定函数(根目录模块) # from module1 import m1 # m1() # 导入模块中所有函数(子包中模块) # from demo.bin1.bin2.write1 import * # write_bytes() # write_text()
'''import 方式导入,''' # 在__init__.py 文件中事先导入模块:from demo.bin1.module1 import * (导入module模块中的所有函数) # import demo.bin1 # # demo.bin1.m2() # demo.bin1.m1() # demo.bin1.module1.m1() # 在__init__.py 文件中事先导入模块:import demo.bin1.module1 (导入module模块) # import demo.bin1 # demo.bin1.module1.m2() # demo.bin1.module1.m1() # 导入子包 # 在子包的__init__.py 文件中事先导入子包中的模块:import demo.bin1.bin2.write1 # import demo.bin1.bin2 # # demo.bin1.bin2.write1.write_text() # demo.bin1.bin2.write1.write_bytes() # 导入子包 # 在子包的__init__.py 文件中事先导入子包中的模块:from demo.bin1.bin2.write1 import * # import demo.bin1.bin2 # # demo.bin1.bin2.write1.write_text() # demo.bin1.bin2.write1.write_bytes() ''' 在包中的__init__.py 未写入任何模块的引用的前提下,直接导入包 ,将无法正常使用 以下导入后,调用将报错:AttributeError: module 'demo.bin1.bin2' has no attribute 'write1' 故仅仅导入包的情况下,要在包中的__init__.py 对应模块的引用 ''' # import demo.bin1.bin2 # # demo.bin1.bin2.write1.write_text() # demo.bin1.bin2.write1.write_bytes()
'''from...import...方式导入包''' # 在子包的__init__.py 文件中事先导入子包中的模块:import demo.bin1.bin2.write1 # from demo.bin1 import bin2 # # bin2.write1.write_bytes() # bin2.write1.write_text() # 在包中的__init__.py 文件中事先导入子包中的模块:import demo.bin1.module1 (带上根目录路径) 或者写入from demo.bin1.module1 import * # from demo import bin1 # # bin1.module1.m2() # bin1.module1.m1() # # 在包中的__init__.py 文件中事先导入子包中的模块:import demo.bin1.module1 (带上根目录路径) # from demo.bin1.bin2 # # bin1.module1.m2() # bin1.module1.m1()
两个模块中存在相同的函数名,在导入的时候 使用别名用于区分
# 导入支持 as 别名,用于区分两个模块中相同名字的函数名 # from bin1.bin2.write1 import write_text as b2_write # from bin1.write1 import write_text as b1_write # # # b1_write() # b2_write