【290】Python 模块(自定义包)
参考:Python 模块
目录:
- 1. import 语句(模块的引入)
- 2. from...import 语句
- 3. from...import * 语句
- 4. dir() 函数
- 5. Python 中的包
- 5.1 在 *.py 文件中引用自定义包
- 5.2 在控制台中引用自定义包
- 6. PYTHONPATH 变量
Python 模块 (Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和 Python 语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
模块定义好后,我们可以使用 import 语句来引入模块,语法如下:
1 | import module1[, module2[,... moduleN] |
比如要引用模块 math,就可以在文件最开始的地方用 import math 来引入。在调用 math 模块中的函数时,必须这样引用:
1 | 模块名.函数名 |
当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。
需要将以下两个文件放置在同一个文件夹内(自动搜索当前目录)
目录结构如下:
1 2 3 | ... | - - support.py | - - test.py |
源代码如下:
support.py
1 2 3 4 5 | # coding=utf-8 def print_func( par ): print "Hello : " , par return |
test.py
1 2 3 4 5 6 7 8 9 | # coding=utf-8 # 导入模块 import os import support # 现在可以调用模块里包含的函数了 support.print_func( "Runoob" ) # 用于暂停显示,否则窗体会一闪而过 os.system( "pause" ) |
以上实例输出结果:
1 | Hello : Runoob |
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:
1 | from modname import name1[, name2[, ... nameN]] |
例如,要导入模块 math 的 log 和 log10 函数,使用如下语句:
1 2 3 | >>> from math import log, log10 >>> log( 2 ) 0.6931471805599453 |
这个声明不会把整个 math 模块导入到当前的命名空间中,它只会将 math 里的 log/log10 单个引入到执行这个声明的模块的全局符号表。
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
1 | from modname import * |
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
例如我们想一次性引入 math 模块中所有的东西,语句如下:
1 | from math import * |
dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。
返回的列表容纳了在一个模块里定义的所有模块,变量和函数。如下一个简单的实例:
1 2 3 4 5 6 7 | >>> import math >>> content = dir (math) >>> print content [ '__doc__' , '__name__' , '__package__' , 'acos' , 'acosh' , 'asin' , 'asinh' , 'atan' , 'atan2' , 'atanh' , 'ceil' , 'copysign' , 'cos' , 'cosh' , 'degrees' , 'e' , 'erf' , 'erfc' , 'exp' , 'expm1' , 'fabs' , 'factorial' , 'floor' , 'fmod' , 'frexp' , 'fsum' , 'gamma' , 'hypot' , 'isinf' , 'isnan' , 'ldexp' , 'lgamma' , 'log' , 'log10' , 'log1p' , 'modf' , 'pi' , 'pow' , 'radians' , 'sin' , 'sinh' , 'sqrt' , 'tan' , 'tanh' , 'trunc' ] |
在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。
存在两种引用方式,其一为引用所需要的函数,可以直接使用,其二为引用所有的文件,使用时需要 模块名+函数名形式
5.1 在 *.py 文件中引用自定义包
☀☀☀<< 举例 >>☀☀☀
引用全部函数形式:目录结构如下
1 2 3 4 5 6 | ... | - - test.py | - - package_01 | - - __init__.py | - - module_1.py | - - module_2.py |
源代码如下:
package_01/module_1.py
1 2 3 4 5 6 7 | # coding=utf-8 def run_11(): print "I'm in run_11" def run_12(): print "I'm in run_12" |
package_01/module_2.py
1 2 3 4 5 6 7 | # coding=utf-8 def run_21(): print "I'm in run_21" def run_22(): print "I'm in run_22" |
现在,在 package_runoob 目录下创建 __init__.py,__init__.py可以为空,只要它存在,就表明此目录应被作为一个package处理。当然,__init__.py 中也可以设置相应的内容。
本例中 __init__.py 设置为空,然后是 test.py 文件
test.py
1 2 3 4 5 6 7 8 9 10 11 12 | # coding=utf-8 # 将包内的函数导入,用的时候可以直接写函数名称 from package_1.module_1 import run_11 from package_1.module_1 import run_12 from package_1.module_2 import run_21 from package_1.module_2 import run_22 run_11() run_12() run_21() run_22() |
以上实例输出结果如下:
1 2 3 4 | I'm in run_11 I'm in run_12 I'm in run_21 I'm in run_22 |
☀☀☀<< 举例 >>☀☀☀
引用全部函数形式:目录结构如下
1 2 3 4 5 6 | ... | - - test1.py | - - package_01 | - - __init__.py | - - module_1.py | - - module_2.py |
源代码如下:
module_1.py 与 module_2.py 和上面文件内容一样,主要看 __init__.py 与 test1.py 文件中的内容
__init__.py
1 2 3 4 | # coding=utf-8 # 将其他文件名包含进来 __all__ = [ 'module_1' , 'module_2' ] |
test1.py
1 2 3 4 5 6 7 8 9 | # coding=utf-8 # 将包全部导入,用的时候需要通过 模块.函数 的形式 from package_1 import * module_1.run_11() module_1.run_12() module_2.run_21() module_2.run_22() |
运行结果与上面一样
说明:如果在 module_2 中调用 module_1 的函数,操作如下:
module_2.py
1 2 3 4 5 6 7 | ... def a(): # 导入包 import package_01 # 直接完整调用 module_1 中的函数 package_01.module_1.fuc() ... |
5.2 在控制台中引用自定义包
具体内容如上所示,调用源码如下:
1 2 3 4 5 6 7 8 9 | >>> import sys >>> # 添加包所在的文件夹 >>> sys.path.append(r "D:\package2" ) >>> # 以下内容与 5.1 一致 >>> from package_1 import * >>> module_1.run_11() I'm in run_11 >>> module_1.run_12() I'm in run_12 |
作为环境变量,PYTHONPATH 由装在一个列表里的许多目录组成。
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
1、当前目录
2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
3、如果都找不到,Python会察看默认路径。模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
通过将变量添加到 PYTHONPATH 变量中,就可以直接引用相应的包,如下将“D:\03-Study\Python\Module”添加到 PYTHONPATH 变量中
计算机 → 属性 → 高级系统设置 → 高级 → 环境变量 → 系统变量 → 新建 → 变量名:PYTHONPATH(大小写都可以 ) → 变量值:D:\03-Study\Python\Module
参考:Setting up PythonPath (Python Path) system variable for Windows (Blender)
查看与使用
1 2 3 4 5 6 7 8 | >>> import sys >>> sys.path [ 'D:\\03-Study\\Python\\Module' , ...] >>> # 可以直接引入自定义包 >>> from arcpy_diy import * >>> mxd = ap.getCurrentMxd() >>> df = ap.getDataFrame_0() >>> lyrs = ap.getLyrs() |
包内部的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # coding=utf-8 import arcpy def getLyrs(): # 特别注意,直接拷过来代码会出错 # 原因是拷过来的代码缩进是空格 # 与自动缩进的 tab 键是不同的 # 因此需要特别将空格删除,通过选中可看出区别 "获取当前 mxd 文件的所有图层" mxd = arcpy.mapping.MapDocument( "CURRENT" ) lyrs = arcpy.mapping.ListLayers(mxd) return lyrs def getCurrentMxd(): "获取当前 mxd 文件的 mxd" mxd = arcpy.mapping.MapDocument( "CURRENT" ) return mxd def getDataFrame_0(): "获取当前 mxd 文件的第一个数据框架" mxd = arcpy.mapping.MapDocument( "CURRENT" ) df = arcpy.mapping.ListDataFrames(mxd)[ 0 ] return df def zoomToLyr( index ): "将地图缩放到指定的图层" mxd = arcpy.mapping.MapDocument( "CURRENT" ) df = arcpy.mapping.ListDataFrames(mxd)[ 0 ] lyrs = arcpy.mapping.ListLayers(mxd) df.extent = lyrs[index].getExtent() def setEnvWorkspace( path ): "设置环境变量" arcpy.env.workspace = path def exportToJpeg( name ): "将地图文档出图" mxd = arcpy.mapping.MapDocument( "CURRENT" ) df = arcpy.mapping.ListDataFrames(mxd)[ 0 ] arcpy.mapping.ExportToJPEG(mxd, arcpy.env.workspace + "\\" + name, resolution = 300 ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)