Python学习之路10——Python常用模块

  一、模块介绍

   1、模块定义

    用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件。

    分类:内置模块、开源模块、自定义模块。

   2、导入模块

    本质:导入模块的本质就是把python文件解释一遍;导入包的本质就是把包文件下面的init.py文件运行一遍。

    1. 同目录下的模块导入

1 #同级目录间import
2  
3 import module_name              #直接导入模块
4 import module_name,module2_name     #导入多个模块     使用:模块名.加函数名
5 from module_name import *           #导入模块中所有函数和变量等。。不建议使用
6 from module_name import m1,m2,m3        #只导入模块中函数m1,m2,m3  使用:直接使用m1,m2,m3即可
7 from module_name import m1 as m   #导入module_name模块中m1函数并且重新赋值给m  使用:直接输入m即可

    2.不同目录下的模块导入

 1 #不同目录之间import  当前文件main.py
 2  
 3 #目录结构
 4 # ├── Credit_card
 5 #
 6 # ├── core  #
 7 # │   ├── __init__.py
 8 # │   └── main.py  # 当前文件
 9 # ├── conf  #
10 # │   ├── __init__.py
11 # │   └── setting.py
12 # │   └── lzl.py
13  
14 import sys,os
15  
16 creditcard_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前目录的上上级目录绝对路径,即Creditcard目录
17 sys.path.insert(0,creditcard_path)    #把Creditcard目录加入到系统路径列表第0个
18  
19 print(sys.path)                      #打印系统环境路径
20 #['C:\\Users\\L\\PycharmProjects\\s14\\Day5\\Creditcard,.......]
21  
22 #import settings.py                   #无法直接import
23 #ImportError: No module named 'settings'
24  
25 from conf import settings           #from目录import模块
26  
27 settings.set()                        #执行settings下的函数
28 #in the settings

         3.不同目录下模块连坏导入

目录结构
├── Credit_card
├── core  #
│   ├── __init__.py
│   └── main.py  # 当前文件
├── conf  #
│   ├── __init__.py
│   └── setting.py
 │   └── lzl.py

 目录结构

    conf目录下的文件:

    lzl.py

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 #-Author-Lian
4 
5 #当前文件lzl.py
6 def name():
7     print("name is lzl")
8 
9 lzl.py

    setting.py

 1 #当前文件settings,调用lzl.py模块
 2 import lzl              #导入模块lzl
 3 
 4 def set():
 5     print("in the settings")
 6     lzl.name()              #运行lzl模块下的函数
 7 
 8 set()                       #执行函数set
 9 #in the settings
10 #name is lzl

    此时执行settings.py文件没有任何问题,就是同一目录下的模块之间的导入,关键来了,此刻croe目录下的main.py导入模块settings会出现什么状况呢??!

    core目录下的文件:

    main.py

 1 #不同目录之间连环import 当前文件main.py
 2 import sys,os
 3  
 4 creditcard_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前目录的上上级目录绝对路径,即Creditcard目录
 5 sys.path.insert(0,creditcard_path)    #把Creditcard目录加入到系统路径
 6  
 7 from conf import settings
 8  
 9 settings.set()                        #执行settings下的函数
10 #    import lzl              #导入模块lzl
11 #ImportError: No module named 'lzl'

    可以看到直接报错:ImportError: No module named 'lzl',想想什么会报错类?!

    刚才已经说到了,导入模块的本质就是把模块里的内容执行一遍,当main.py导入settings模块时,也会把settings里的内容执行一遍,即执行import lzl;

    但是对于main.py来说,不能直接import lzl,所有就出现了刚才的报错,那有什么办法可以解决?!

    对conf目录下settings.py文件进行修改

 1 #当前文件settings,调用lzl.py模块
 2 from . import lzl              #通过相对路径导入模块lzl
 3 
 4 def set():
 5     print("in the settings")
 6     lzl.name()              #运行lzl模块下的函数
 7 
 8 set()                       #执行函数set
 9 #in the settings
10 #name is lzl

    此时执行main.py文件

 1 #不同目录之间连环import 当前文件main.py
 2 import sys,os
 3  
 4 creditcard_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前目录的上上级目录绝对路径,即Creditcard目录
 5 sys.path.insert(0,creditcard_path)    #把Creditcard目录加入到系统路径
 6  
 7 from conf import settings
 8  
 9 settings.set()                        #执行settings下的函数
10 # in the settings
11 # name is lzl

   没有任何报错,我们只对settings修改了lzl模块的调用方式,结果就完全不同,此时的from . import lzl 用到的是相对路径,这就是相对路径的优点所在。

   4、不同目录多个模块互相导入,用相对路径

   目录结构:

Day5
    ├── Credit_card
            ├── README.md
            ├── core 
            │   ├── __init__.py
            │   └── main.py 
            ├── conf 
            │   ├── __init__.py
            │   └── setting.py
            │   └── lzl.py        

目录结构

    conf目录下的文件:

    lzl.py

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 #-Author-Lian
4 
5 #当前文件lzl.py  相对路径
6 def name():
7     print("name is lzl")

    setting.py

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 #-Author-Lian
 4 
 5 #当前文件settings,调用lzl.py模块  相对路径
 6 from . import lzl              #通过相对路径导入模块lzl
 7 
 8 def set():
 9     print("in the settings")
10     lzl.name()              #运行lzl模块下的函数
11 
12 set()                       #执行函数set
13 #in the settings
14 #name is lzl
15 
16 settings

    core目录下的文件:

    main.py

1 #不同目录之间连环import 当前文件main.py  相对路径
2  
3 from Day5.Credit_card.conf import settings
4  
5  
6 settings.set()                        #执行settings下的函数
7 # in the settings
8 # name is lzl

   lzl.py以及settings.py文件未变,main.py文件去掉了繁杂的sys.path添加的过程,直接执行from Day5.Credit_card.conf import settings,使用相对路径,更加简洁方便!

猜你喜欢

转载自www.cnblogs.com/visonwong/p/9012139.html