模块

一、几种导入模块的方式

 1、import语句

1、import语句的简单使用

test.py

print("from the test.py of start")

num = 100

def speak():
    print("form the test.py of speak")

print("from the test.py of end")

 work.py

import test

import test  #一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
import test
import test

执行结果

from the test.py of start
from the test.py of end

2、在第一次导入模块时会做三件事,重复导入会直接引用内存中已经加载好的结果

  1. 为源文件(test模块)创建新的名称空间,在test中定义的函数和方法若是使用到了global时访问的就是这个名称空间。
  2. 在新创建的命名空间中执行模块中包含的代码
  3. 创建名字spam来引用该命名空间

3、被导入模块有独立的名称空间

import test

num = 10

print(test.num)

执行结果

from the test.py of start
from the test.py of end
100

4、为模块名起别名

import test as tt

print(tt.num)

5、在一行导入多个模块

import sys,re,os

2、from ... import...语句

1、for...import...的简单使用

from test import num

2、from...import 与import的对比

唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:spam.

#from...import...的方式有好处也有坏处
    好处:使用起来方便了
    坏处:容易与当前执行文件中的名字冲突
#如果当前有重名read1或者read2,那么会有覆盖效果

3、也支持as

from test import num as nums

4、一行导入多个名字

from test import num, speak

5、from...import *

from test import *
# 把spam中所有的不是以下划线(_)开头的名字都导入到当前位置
#不建议使用

6、模块循环导入问题

待定

3、不同目录结构下的模块导入

1、同级目录

– src
 | – mod1.py
 | – test.py

test.py可以直接调用mod1模块

import mod1
或
from mod1 import *

from mod1 import x,p

2、调用子

– src 
 | – mod1.py 
 | – lib 
 |  | – mod2.py 
 | – test1.py

如果想在程序test1.py中导入模块mod2.py


from lib import mod2

from lib.mod2 import x,pt

from
lib.mod2 import *import lib.mod2  (lib.mod2.x),加前缀

3. 调用上级目录下的文件

– src 
 | – mod1.py 
 | – lib 
 | | – mod2.py 
 | – sub 
 | |– test.py

先看路径是否在sys.path中,不是则添加路径,在按一、二步进行导入

二、模块与脚本

#编写好的一个python文件可以有两种用途:
    一:脚本,一个文件就是整个程序,用来被执行
    二:模块,文件中存放着一堆功能,用来被导入使用
#python为我们内置了全局变量__name__, 当文件被当做脚本执行时:__name__ 等于'__main__' 当文件被当做模块导入时:__name__等于模块名 #作用:用来控制.py文件在不同的应用场景下执行不同的逻辑 if __name__ == '__main__':

三、模块的搜索路径

1、模块的搜索路径:内存中已加载->内置模块->sys.path中包含的路径

#官网链接:https://docs.python.org/3/tutorial/modules.html#the-module-search-path
搜索路径:
当一个命名为spam的模块被导入时
    解释器首先会从内建模块中寻找该名字
    找不到,则去sys.path中找该名字

sys.path从以下位置初始化
执行文件所在的当前目录
PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
依赖安装时默认指定的

注意:在支持软连接的文件系统中,执行脚本所在的目录是在软连接之后被计算的,换句话说,包含软连接的目录不会被添加到模块的搜索路径中

在初始化后,我们也可以在python程序中修改sys.path,执行文件所在的路径默认是sys.path的第一个目录,在所有标准库路径的前面。
这意味着,当前目录是优先于标准库目录的,需要强调的是:我们自定义的模块名不要跟python标准库的模块名重复,除非你是故意的,傻叉。

2、路径的查看与增加

1、使用模块sys.path可以查看路径

import sys

print(sys.path)

执行结果

D:PYprojectTest  #当前文件路径
D:PYproject

D:PyCharm 2019.1.3helperspycharm_display
D:Python3.7.3python37.zip
D:Python3.7.3DLLs
D:Python3.7.3lib
D:Python3.7.3
D:PYprojectvenv
D:PYprojectvenvlibsite-packages
D:PYprojectvenvlibsite-packagessetuptools-40.8.0-py3.7.egg
D:PYprojectvenvlibsite-packagespip-19.0.3-py3.7.egg
D:PyCharm 2019.1.3helperspycharm_matplotlib_backend

2、增加路径

  1. 修改环境变量
  2. 在site-packages路径下添加一个路径配置文件,文件的扩展名为.pth,内容为要添加的路径即可
  3. 使用sys.path.append("路径")
  4. 利用os.path获取相对路径,在通过sys模块进行添加

四、动态导入模块

 1、__import__()

s = __import__("sys")
print(s)  #使用时用s,相当于执行了as操作
print(s.path)

2、无论嵌套了多少层,只导入第一层

s = __import__("test1.test2.test3")
print(s)
执行结果
<module ‘test1’ (namespace)>

3、使用模块importlib

import importlib

m = importlib.import_module("test1.pt")
print(m)

可以导入多层

本文参考:https://www.cnblogs.com/linhaifeng/articles/6379069.html

原文地址:https://www.cnblogs.com/lilong74/p/11367773.html