Python-模块
-
介绍
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段,把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。模块可以被别的程序引入,以使用该模块中的函数等功能。
-
模块分类
- 系统模块 sys,importlib,math
- 用户定义模块
- 第三方模块
-
venv:隔离环境,环境的副本
Python3.3以上的版本通过venv模块原生支持虚拟环境,提供与系统Python的隔离支持。每一个虚拟环境都有其自己的Python二进制(允许有不同的Python版本创作环境),并且可以拥有自己独立的一套Python包。他最大的好处是,可以让每一个python项目单独使用一个环境,而不会影响python系统环境,也不会影响其他项目的环境。
- 优点
- 使不同应用开发环境独立
- 环境升级不影响其他应用,也不会影响全局的python环境
- 防止系统中出现包管理混乱和版本冲突
- 优点
-
-
import
import如何工作:一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
首先找到模块文件,然后编译成位码(需要时),最后执行模块的代码来创建其定义的对象
module_a.py
def add(a,b): return a+b version='1.0' print('add is end') print(__name__=="__main__")
#import unittwo3.module_a from unittwo3.module_a import add from unittwo3.module_a import * #print(unittwo3.module_a.add(10,20)) #30 print(add(10,20)) #30 print(__name__=='__main__')
补充:sys
import sys for i in sys.argv: print(i) #D:/python-project/unittwo3/test.py print(__name__) #__main__:表示当前文件的文件名字 print(sys.path) print(dir())
-
搜索路径
- 当前目录
- 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
import sys print(list(sys.path)) #手动添加目录 sys.path.append('c:\\python\\modules') sys.path.append('c:/python/modules')
-
如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
-
任何.pth文件的内容(如果存在的话)
在python安装路径的site-packages目录下修建了PckPath.pth文件
/Users/lzhan/AI/python/project_modules/modules
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
-
globals()和locals函数
根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。
-
编译
当文件导入时,就会进行编译。因此、通常不会看到程序顶层文件的.pyc字节码文件。除非这个文件也被其他文件导入:只有被导入的文件才会留下字节码文件。顶层文件的字节码是在内部使用后就丢弃了。
-
执行
和def一样,import和form是可执行语句,而不是在编译期间的声明。直到python执行到这些语句时,才会进行解析。
-
distutils
Distutils可以用来在Python环境中构建和安装额外的模块。新的模块可以是纯Python的,也可以是用C/C++写的扩展模块,或者可以是Python包,包中包含了由C和Python编写的模块。
-
from
from会把模块中的变量复制到另一个作用域,所以顶层文件中就可以直接使用该变量了。
from语句智能用在模块文件的顶部,不能放在函数中。from语句有破坏命名空间的潜质!!
-
reload() 函数
当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:
- reload是Python的内置函数,而不是语句
- reload只能重载已经存在的模块对象,而不是变量
- relaod必须手动导入
import public_var as p from importlib import reload print(p.urls['first']) p.urls['first']='baidu.com' print(p.urls['first']) reload(p) print(p.urls['first'])
-
Python中的包:在保重隐藏数据
import modules.public_var from modules.public_var import *
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件, 该文件的内容可以为空。init.py 用于标识当前文件夹是一个包。