020、模块 和 导包
1、模块 和 导包
所说的模块导包都是相对 project 目录的;
a、即可以导入模块名,也可以导入模块里面的内容 (函数 / 全局变量)
b、如果导入的模块名 ,相对于 project 的路径中有包: from 包名[.包名.包名] import 模块名
或: 相对于 project 的路径中没有包 (即在项目根目录下) :import 模块名
c、导入之后,要使用模块当中的内容,则语法为: 模块名.变量 或 模块名.函数(参数)
d、导入模块之后,模块里面的 类、函数、常量(全局变量) 都是可以使用的 ;
e、同级目录下的模块,可以直接导入 import 模块名 ;
f、取模块名的时候,不要和第三方库 、标准库 同名 ;(同名的话,会找到自定义的模块名,不会找标准库 / 第三方库)
g、PEP8标准 ,导包时,先导入python自带的标准库,再导入第三方库,最后导入自定义的库 ,用换行分隔开 ;
导入的模块名,相对于 project 的路径中有包: from 包名[.包名.包名] import 模块名
导入的模块名相对于 project 的路径中没有包 (即在项目根目录下) :import 模块名 ,模块名.类名 使用 ;
同级目录下的模块,可以直接导入 import 模块名 ;
2、找包顺序
1、执行文件当前所在的目录
2、当前工程目录(是pycharm添加进去的)
3、python根目录下的lib目录
4、python根目录下的 lib/site-packages
示例代码如下:
# 找包的路径 import sys for item in sys.path: print(item)
执行结果如下:
3、PEP8代码格式标准 ,导包顺序:
先导入python自带的标准库,再导入第三方库,最后导入自定义的库 ,用换行分隔开 ;
示例代码如下:
# PEP8标准 ,导包时,先导入python自带的标准库,再导入第三方库,最后导入自定义的库 ,用换行分隔开 ; import os # 标准库 import sys import pyaudio # 第三方库 import json import my_module # 自定义的库 m = my_module.MyClass() m.my_method() # 找包的路径 import sys for item in sys.path: print(item)
4、if __name__ == '__main__':
a、在pycharm中输入main 可以自动弹出该语句;
b、该语句表示从当前 .py 作为主入口运行程序,类似于在该 .py 文件中 右击—>Run ; 如果从其他的地方作为主入口,不执行这片代码 ;
c、该语句主要作用是 测试 当前模块 的功能 ;
示例代码如下:
import sys import sys if __name__ == '__main__': # 存放测试代码 # 找包的路径 for item in sys.path: print(item)
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day09\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day09/my_package/test.py D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day09\my_package D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day09 C:\SkyWorkSpace\WorkTools\python\Python38\python38.zip C:\SkyWorkSpace\WorkTools\python\Python38\DLLs C:\SkyWorkSpace\WorkTools\python\Python38\lib C:\SkyWorkSpace\WorkTools\python\Python38 D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day09\venv D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day09\venv\lib\site-packages C:\SkyWorkSpace\WorkTools\python\Python38\lib\site-packages C:\SkyWorkSpace\WorkTools\python\Python38\lib\site-packages\win32 C:\SkyWorkSpace\WorkTools\python\Python38\lib\site-packages\win32\lib C:\SkyWorkSpace\WorkTools\python\Python38\lib\site-packages\Pythonwin Process finished with exit code 0
5、__init__.py 模块
包里面的__init__.py 模块中添加 from my_package.my_module import MyClass ;
在其他地方导入该类时语法可以简单为:from my_package import MyClass ;
a、正常的在 my_package.test.py 要导入 my_module_2 模块,语法是:from my_package_2.my_module_2 improt MyClass ;
b、现在 my_package_2.__init__.py 文件中加入代码:from my_package_2.my_module_2 import MyClass ;
c、在 my_package.test.py 要导入 my_module_2 模块,语法变成:from my_package_2 import MyClass ;
这个意思有点像把 包下所有的类添加到 __init__.py中,其他地方导入时,语法简单了一点 ;
6、 路径操作
参考资料:https://www.runoob.com/python3/python3-os-file-methods.html
https://www.runoob.com/python3/python3-os-path.html
示例代码如下:
import os # 1、动态获取当前文件的绝对路径 # 所谓动态就是:在windows下,是 \ ,在 linux下是 / absolute_path = os.path.abspath(__file__) print(absolute_path) # 2、动态获取所给 文件 所在的目录 file_dir = os.path.dirname(absolute_path) print(file_dir) # 3、动态获取所给 目录 所在的目录 dir_dir = os.path.dirname(file_dir) print(dir_dir) # 4、把目录和文件名合成一个路径 # os.path.join(path1[, path2[, ...]]) windows下是\ ,linux下是 / # 拼接 test_02.py 路径 test_02_py_path = os.path.join(file_dir , 'test_02.py') print(test_02_py_path)
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_01.py D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\test_01\test_01.py D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\test_01 D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10 D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\test_01\test_02.py # 拼接的路径 Process finished with exit code 0
补充知识: