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)
View Code

 

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)
View Code

  执行结果如下:

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
View Code

 

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)
View Code

  执行结果如下:

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
View Code

 

 

 

补充知识:

 

 

 

 

posted @ 2021-07-29 12:01  空-山-新-雨  阅读(66)  评论(0编辑  收藏  举报