Python的__init__.py用法
python中包的引入,对于大型项目中都会使用到这个功能,把实现不同功能的python文件放在一起,组成不同lib库,然后在其他地方调用。
包,python源文件+__init__.py
模块,python源文件
1、__init__.py基本介绍
首先看下面这个例子
例子1
1 2 3 4 5 6 7 | #!/usr/bin/env python2.7 #-*- coding:utf-8 -*- from package.src.test import A a = A( 2 ) a.aPrint() |
从package包中的src子包中test.py文件中,引入A类,如何实现这一点??
需要构建如下的目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@typhoeus79 test] # tree . | - - package | | - - __init__.py | | - - __init__.pyc | ` - - src | | - - __init__.py | | - - __init__.pyc | | - - test.py | ` - - test.pyc ` - - test_pack.py 2 directories, 7 files |
这里面涉及到两个目录,package和src目录,并且每个目录中都有__init__.py文件。
python的每个模块的包中,都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module,是将目录设置为module的标识。
2、__init__.py其他功能
其实,__init__.py里面还是可以有内容的,我们在导入一个包时,实际上导入了它的__init__.py文件。
我们可以再__init__.py文件中再导入其他的包,或者模块。
[python]
import readers
import writers
import commands
import users
import meta
import auth
import admin
这样,当我们导入这个包的时候,__init__.py文件自动运行。帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。
不需要一个个去导入module了。
__init__.py 中还有一个重要的变量,叫做 __all__。我们有时会使出一招“全部导入”,也就是这样:
from PackageName import *
这时 import 就会把注册在包 __init__.py 文件中 __all__ 列表中的子模块和子包导入到当前作用域中来。比如:
#文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
例子2:
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 | [root@typhoeus79 test] # tree . | - - package | | - - __init__.py | | - - __init__.pyc | ` - - src | | - - __init__.py | | - - __init__.pyc | | - - test.py | ` - - test.pyc ` - - test_pack.py 2 directories, 7 files [root@typhoeus79 test] # more ./package/__init__.py import os import datetime [root@typhoeus79 test] # more test_pack.py #!/usr/bin/env python2.7 #-*- coding:utf-8 -*- from package.src.test import A from package.__init__ import * a = A( 2 ) a.aPrint() print datetime.datetime.now() [root@typhoeus79 test] # ./test_pack.py 2 2014 - 07 - 28 16 : 35 : 09.267241 |
3、子目录之间模块引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | . | - - __init__.py | - - lib | | - - __init__.py | | - - __init__.pyc | | - - src | | | - - __init__.py | | | - - __init__.pyc | | | - - a.py | | ` - - a.pyc | ` - - test.py | - - main | | - - __init__.py | ` - - b.py ` - - test.py |
main目录中的b.py脚本调用lib->src->a.py中的类AObject
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@typhoeus79 ice_test_m test] # more main/b.py #!/usr/bin/env python2.7 #-*- coding:utf8 -*- import sys import os sys.path.append(os.path.dirname(__file__) + os.sep + '../lib' ) from src.a import AObject def main(): ao = AObject( 'Helloword' ) ao.printword() if __name__ = = '__main__' : main() |
需要把lib目录的绝对路径添加到path中
当然也可以这么写
1 2 3 4 5 6 7 | sys.path.append(os.path.dirname(__file__) + os.sep + '../' ) from lib.src.a import AObject def main(): ao = AObject( 'Helloword' ) ao.printword() |
会从sys.path中查找
使用相对路径执行./b.py,sys.path最后一项为./../
使用绝对路径执行python2.7 /data1/guosong/opdir/20141013/test/main/b.py ,sys.path最后一项为/data1/guosong/opdir/20141013/test/main/../
然后按照这个路径,进行目录lib->src->a.py查找对应的类
4、参考文献
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法