模块、包、库前置知识
2.1 模块、包、库前置知识
这一章节我们来了解下Python编程中经常遇到的模块、包、库及虚拟环境。在开始学习之前我们需要了解一些前置知识。
2.1.1 Python脚本文件类型
Python编程中编写的脚本通常是以文件形式保存在磁盘中的。其中常见的脚本文件类型如下:
文件类型 | 文件说明 |
---|---|
.py |
源文件 |
.pyc |
源文件编译后的文件 |
.pyo |
源文件优化编译后的文件 |
.pyd |
其他语言写的Python库 |
Python在运行时会先将源码py文件编译成pyc或者pyo,然后由Python的虚拟机执行,相对于py文件来说,编译成pyc或pyo本质上和py没有太大的区别,只是对于这个文件的加载速度提高了,但是不会提高代码的执行速度。
2.1.2 环境变量
我们可以粗略的将环境变量理解为路径包。当程序需要查找指定的文件时,就会在相应的环境变量指定的路径包中按照顺序查找。如果全部查找完毕后仍然没有找到,那么就回会报错。
环境变量有两种类型:
1、系统环境变量
系统环境变量,顾名思义,就是系统级别的。也就是说一旦配置了系统环境变量后,只要是使用这个操作系统的用户,不管任何用户都能通过这个环境变量直接找到相应的路径。
2、用户环境变量
用户环境变量,顾名思义,是独属于某个用户的,其它用户不能使用或者使用时指向的路径包不一样。
Python编程中最重要的环境变量就是PYTHONPATH
。当在运行Python程序时如果遇到找不到路径的时候就可以尝试在这个环境变量中添加。具体的添加路径方式如下:
1、先打开环境变量编辑窗口,可以通过在搜索框中搜索关键字环境变量
打开或者右键此电脑
,在弹出的菜单栏中点击属性
,然后再点击左边的高级系统设置
。在弹出的系统属性
窗口中切换到高级
选项卡,点击下方的环境变量
即可。
2、拖动下方的系统变量
下拉滚动条,找到PYTHONPATH
,点击编辑即可对该条系统变量进行编辑。如果没有该条目,则可以点击新建
以创建。
练习
随意新建一个文件夹并将该文件夹地址添加到Python搜索路径中。
2.1.3 Python搜索路径
一般Python在运行时会按照一定的顺序在搜索路径下查找对应的包或者模块。如果没有找到则会报错。Python搜索路径存放在sys模块下的path中。是以一个列表形式保存。使用下面的代码可以查看到本机Python的搜索路径:
import sys
import pprint
pprint.pprint(sys.path)
笔者电脑的查询结果如下:
['E:\studypy',
'E:\studypy',
'E:\studypy\source',
'E:\FrbPythonFiles\Scripts', 'D:\Soft_Installed\PyCharm_2021.3.3_pro\plugins\Python\helpers\pycharm_display',
'C:\Program Files\Python3102\Python310.zip',
'C:\Program Files\Python3102\DLLs',
'C:\Program Files\Python3102\lib',
'C:\Program Files\Python3102',
'C:\Users\思必得\AppData\Roaming\Python\Python310\site-packages',
'C:\Program Files\Python3102\lib\site-packages',
'C:\Program Files\Python3102\lib\site-packages\win32',
'C:\Program Files\Python3102\lib\site-packages\win32\lib',
'C:\Program Files\Python3102\lib\site-packages\Pythonwin',
'D:\Soft_Installed\PyCharm_2021.3.3_pro\plugins\Python\helpers\pycharm_matplotlib_backend']
下面对查询的结果进行说明:
第1行:本py文件所在的目录路径
(第2行):在Pycharm中运行py文件,则为项目结构中根
指定的目录路径
(第3行):在Pycharm中运行py文件,则为项目结构中源文件夹
指定的目录路径
(第4行):为在系统环境变量PYTHONPATH中指定的路径
(第5行):在Pycharm中运行py文件,则为PyCharm软件的指定所示路径。
第6行-第14行为当前Python解释器相关路径。
打印出来的每个字符串都表示一个位置,如果要让解释器能够找到模块,可将其放在其中任何一个位置中。虽然放在这里显示的任何一个位置中都可行,但目录site-packages
是最佳的选择,因为它就是专门用来放置第三方模块
的。(这个之后会介绍)
不过有时候将模块放在正确的位置可能不是合适的解决方案,其中的原因很多。
- 不希望Python解释器的目录中充斥着你编写的模块。
- 没有必要的权限,无法将文件保存到Python解释器的目录中。
- 想将模块放在其他地方。
最重要的是,如果将模块放在其他地方,就必须告诉解释器到哪里去查找。
方法一:修改sys.path
直接修改sys.path(使用append方法)。这个方法修改后的搜索路径并不是永久性的。
方法二:修改PYTHONPATH环境变量
将模块所在的位置添加到系统环境变量中PYTHONPAT中。这个方法是永久性的。重启电脑后依旧生效。不过要记得重启PyCharm。
练习
通过交互模式查看电脑上的Python搜索路径。
2.1.4 命名空间
2.1.4.1 命名空间的概念
Python使用叫做命名空间的东西来记录变量的轨迹。命名空间实际上是一个字典,它的键
就是变量名,它的值
就是那些变量的值。
在一个 Python程序中的任何一个地方,都存在几个可用的命名空间。
1、每个函数
都有着自已的命名空间,叫做局部命名空间
,它记录了函数的变量,包括函数的参数和局部定义的变量。
2、每个模块
拥有它自己的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。
2.1.4.2 作用域的概念
是指Python程序可以直接访问到的命名空间。直接访问
意味着访问命名空间中的命名时不需要加入附加的修饰符。
2.1.4.3 命名空间查找顺序
局部命名空间
:特指当前函数或类的方法。全局命名空间
:特指当前的模块。内置命名空间
:Python在运行时自动加载的函数或者变量(builtins)。
当一行代码要使用变量 x 的值时,Python会到所有可用的命名空间去查找变量,查找的顺序为:局部命名空间
→全局命名空间
→内置命名空间
如果 Python在这些命名空间找不到 x,它将放弃查找并引发一个 NameError 异常:NameError: name 'x' is not defined。
如果存在嵌套函数,则会在当前函数的命名空间中搜索不到时,依次在父函数并一层层往上继续搜索,如果所有的祖上函数都搜索不到时,再开始到
全局命名空间
中搜索。
2.1.4.4 命名空间的生命周期
不同的命名空间在不同的时刻创建,有不同的生存期。
1、内置命名空间在 Python解释器启动时创建,会一直保留,不被删除。
2、模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。
3、当函数被调用时创建一个局部命名空间,当函数返回结果或抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。
Python的一个特别之处在于其赋值操作总是在最里层的作用域。赋值不会复制数据而只是将命名绑定到对象。删除也是如此:del y
只是从局部作用域的命名空间中删除命名 y 。事实上,所有引入新命名的操作都作用于局部作用域。
2.1.4.5 命名空间的访问
函数locals()
返回一个字典。这个字典存放了所有的局部命名空间变量。
函数globals()
返回一个字典。这个字典存放了所有的全局命名空间变量。
可以通过修改命名空间字典的方式从而直接修改命名空间中的变量,比如增加变量、修改变量的值、删除变量等。
练习
1、查看__builtins__
中的所有对象。
2、通过locals
和globals
函数查看局部命名空间和全局命名空间变量。