本文共 4287 字,大约阅读时间需要 14 分钟。
Python中使用包管理模块,包通常对应一个目录,必须在目录下创建一个init.py模块,init.py模块的模块名称即为包名,Python才会将目录解析为包。
init.py文件内可以定义初始化包的内容,导入包的内容,限制包内模块的导出。init.py文件可以为空,也可以是一个模块,其模块名称为包名称。导入包或包的模块、变量、函数时,init .py文件会被自动执行。Python中一个.py文件就是一个模块。
Python 中用 import 或者 from...import 来导入相应的模块。将整个模块(somemodule)导入,格式为: import somemodule从某个模块中导入某个函数或变量,格式为: from somemodule import somefunction从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc将某个模块中的全部函数或变量导入,格式为: from somemodule import *
import sysprint('================Python import module==========================')print('命令行参数为:')for i in sys.argv: print(i)print("python 路径为", sys.path)from sys import argv, path # 导入特定的成员print('================python from import===================================')print(argv)print(path)
对导入的模块进行重命名
Import package.module as nameimport导入包或模块时,如果导入模块较多需要换行,可以使用反斜杠,或是将使用小括号将包含所有的模块。包和模块不会被重复导入。模块内部预定义了内置变量:
name :当前模块名称package :当前模块所属包的名称doc :当前模块的注释内容file :当前文件# -*- coding:utf-8 -*-print("name: " + __name__)print("package: " + (__package__ or "当前模块不属于任何包"))print("doc: " + (__doc__ or "当前模块没有任何注释"))print("file: " + __file__)# name: __main__# package: 当前模块不属于任何包# doc: 当前模块没有任何注释# file: test.py
如果某个文件被当作入口文件,内置变量package 没有值,name 值为main,doc ,file 值为文件名称(不含路径)。
每个模块都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分模块是主执行文件还是被调用的模块文件,Python引入了一个变量name,当文件是被调用时,name的值为模块名,当文件作为入口被执行时,name为'main'。因此,可以在每个模块中写上测试代码,测试代码仅当模块被Python直接执行时才会运行,代码和测试结合在一起,完美实现对测试驱动开发(TDD)的支持。if __name__ == "__main__": function_name()
将一个模块文件作为模块执行而不是应用执行的命令如下:
python3 -m package.module
import只能导入包和模块,不能直接导入变量或者函数。对于多层包嵌套后导致导入名称过长,可以为其重命名。
import package1.package2.module_nameimport package1import package1.module_nameimport package1.package2.module_name as new_name
导入包和模块时需要避免循环导入,两个或者多个模块文件互相导入会报错。
Python在导入模块时,会执行模块里的所有内容,但多次导入只会执行一次。Import导入包或模块时,Python 解释器寻找模块的优先级如下:A、当前目录B、环境变量PYTHONPATHC、sys.path(list 类型)模块在被导入执行时,Python解释器为加快程序的启动速度,会在与模块文件同一目录下自动生成.pyc文件,.pyc是经过编译后的字节码。Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行。导入某个模块的变量,多个使用逗号分隔
from package1.package2.module_name import variable_name
导入某个模块的函数,多个使用逗号分隔
from package1.package2.module_name import function_name
导入某个包的某个模块,多个使用逗号分隔from package1 import module_name
导入模块的所有变量和函数from package1.module_name import *
在模块内使用内置all属性指定本模块可以导出的变量或函数,外部导入只能使用指定的变量或函数。在模块(*.py
)中使用导出all列表里的类、函数、变量等成员,否则将导出所有不以下划线开头(私有)的成员,在模块中使用all属性可避免在相互引用时的命名冲突。 #!/usr/bin/python3__all__ = ["variable1", "variable2", "function_name1", "function_name2"]variable1 = 0variable2 = 0def function_name1(args): passdef function_name2(args): pass
在导入变量和函数时,如果变量和函数太多需要换行,则可以使用反斜杠换行或是使用小括号修饰多个变量或函数。
from package1.module_name import variable1, variable2 \ variable3, function_name1from package1.module_name import (variable1, variable2, function_name2, function_name2)
顶级包与入口文件 main.py 的位置有关,与 main.py 同级的包是顶级包,因此main.py入口文件不属于任何包。
相对导入是导入模块时指定被导入模块名称的相对路径。
import 不支持相对导入,只能使用 from ... import ... 格式实现相对导入,“ . .. ... ” 来表示相对路径,一个点表示当前包,两个点表示上一级包,以此类推。入口文件中没有包的概念,因此不能使用相对导入。使用相对导入不要超出顶级包,入口文件同级的包都不能使用相对导入。在main.py如果作为模块执行时,可以使用相对导入,此时使用如下命令执行:python3 -m main.py
绝对导入是导入时必须指定从顶级包到被导入模块名称的完整路径,可以使用import 和 from ... import ...进行导入。
init.py文件存在包的根目录下,当包或者包中的任意模块或模块中变量、函数被导入时,init.py中内容会首先自动被执行。因此,init.py文件可以实现如下应用:
A、限制本包的模块导入在init.py中写入内置函数all,决定哪些模块可以被外部导入。__all__ = ["module_name1", "module_name2"]
B、批量导入如果包内多个模块文件都需要用到某些模块文件时,可以在包的init.py文件中导入需要的模块文件,然后就可以在本包不同的模块文件中直接使用导入的模块 。 通常,Python文件结构如下:
#!/usr/bin/python3# 模块文档""" This is an example."""# 模块导入import sysimport os# 定义全局变量debug = True# 定义类class class_name: pass# 定义函数def function_name(): pass# 主程序if __name__ == "__main__": function_name()
通常,Python项目的目录结构如下:
README:项目说明文档。bin(scripts):存放项目的可执行脚本。project_name:存放项目的所有源代码,程序的入口文件最好命名为main.py。docs: 存放项目文档。tests:测试代码目录。extras:项目扩展部分,不属于项目必需的部分,存放与项目相关的sample、poc,通常子目录如下dev_example、production_example、test1_poc、test2_poc。setup.py:项目安装、部署、打包的脚本。requirements.txt:存放软件依赖的外部Python包列表。README:项目说明文件。LICENSE.txt:版权声明ChangeLog.txt:版本变更日志记录AUTHORS:作者清单INSTALL:安装说明MANIFEST.in:装箱清单文件MAKEFILE:编译脚本转载于:https://blog.51cto.com/9291927/2409627