`
m4774411wang
  • 浏览: 112659 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

python __init__.py的相关知识点

阅读更多

python中的Module是比较重要的概念。常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在 sys.path 中增加事先写好的.py文件所在的目录,然后import。这样的做法,对于少数文件是可行的,但如果程序数目很 多,层级很复杂,就很吃力了。
有没有办法,像Java的Package一样,将多个.py文件组织起来,以便在外部统一调用,和在内部互相调用呢?答案是有的。
主要是用到python的包的概念,python __init__.py 在包里起一个比较重要的作用
要弄明白这个问题,首先要知道,
python 在执行import语句时,到底进行了什么操作,按照python的文档,它执行了如下操作:
第1步,创建一个新的,空的module对象(它可能包含多个module);
第2步,把这个module对象插入sys.module中
第3步,装载module的代码(如果需要,首先必须编译)
第4步,执行新的module中对应的代码。

在执行第3步时,首先要找到module程序所在的位置,其原理为:
如 果需要导入的module的名字是m1,则解释器必须找到m1.py,它首先在当前目录查找,然后是在环境变量PYTHONPATH中查找。 PYTHONPATH可以视为系统的PATH变量一类的东西,其中包含若干个目录。如果PYTHONPATH没有设定,或者找不到m1.py,则继续搜索 与python的安装设置相关的默认路径,在Unix下,通常是/usr/local/lib/python。
事实上,搜索的顺序是:当前路径 (以及从当前目录指定的sys.path),然后是PYTHONPATH,然后是python的安装设置相关的默认路径。正因为存在这样的顺序,如果当前 路径或PYTHONPATH中存在与标准module同样的module,则会覆盖标准module。也就是说,如果当前目录下存在xml.py,那么执 行import xml时,导入的是当前目录下的module,而不是系统标准的xml。

了解了这些,我们就可以先构建一个package,以普通module的方式导入,就可以直接访问此package中的各个module了。

Python中的package定义很简单,其层次结构与程序所在目录的层次结构相同,这一点与Java类似,唯一不同的地方在于,python中的package必须包含一个__init__.py 的文件。
例如,我们可以这样组织一个package:

package1/
    __init__.py
    subPack1/
        __init__.py
        module_11.py
        module_12.py
        module_13.py
    subPack2/
        __init__.py
        module_21.py
        module_22.py
    ……

__init__.py可以为空,只要它存在,就表明此目录应被作为一个package处理。当然,__init__.py中也可以设置相应的内容,下文详细介绍。

好了,现在我们在module_11.py中定义一个函数:

def funA():
    print "funcA in module_11"
    return

在顶层目录(也就是package1所在的目录,当然也参考上面的介绍,将package1放在解释器能够搜索到的地方)运行python:

>>>from package1.subPack1.module_11 import funcA
>>>funcA()
funcA in module_11

这样,我们就按照package的层次关系,正确调用了module_11中的函数。

细心的用户会发现,有时在import语句中会出现通配符*,导入某个module中的所有元素,这是怎么实现的呢?
答案就在__init__.py中。我们在subPack1的__init__.py文件中写

__all__ = ['module_13', 'module_12']

然后进入python

>>>from package1.subPack1 import *
>>>module_11.funcA()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_11

也就是说,以*导入时,package内的module是受__init__.py限制的。

好了,最后来看看,如何在package内部互相调用。
如果希望调用同一个package中的module,则直接import即可。也就是说,在module_12.py中,可以直接使用

import module_11

如果不在同一个package中,例如我们希望在module_21.py中调用module_11.py中的FuncA,则应该这样:

from package1.subPack1.module_11 import funcA

0
1
分享到:
评论

相关推荐

    discussion.zip Python关于import的实验(10) 利用__init__.py文件将变量和包下的模块作为包的属性

    下面将详细介绍这个过程及其相关知识点。 首先,`__init__.py`文件在Python中扮演着特殊的角色。当一个目录下包含此文件时,Python会将其视为一个包。这个文件可以为空,也可以包含初始化代码,用于设置包的默认...

    测试包.zip 分析__init__.py的执行和使用,以及内部的导入和内部定义的变量

    这个`测试包.zip`文件显然包含了关于`__init__.py`的使用和分析,以及如何在Python中进行导入操作的相关实验。下面我们将详细探讨这些知识点。 1. **`__init__.py` 的作用**: - `__init__.py` 是Python中的一个...

    Python库 | test_zzz_sdk-0.0.10-py2.py3-none-any.whl

    关于Python库的使用和管理,以下是一些相关知识点: 1. **Python环境管理**:Python有多种环境管理工具,如`venv`(Python 3内置)和`virtualenv`,它们允许创建独立的Python环境,避免不同项目间的依赖冲突。 2. ...

    python-mysql.zip_MYSQL_pymysql_python MySQL_python连接mysql_连接数据库

    以下是一些关于使用Python和`pymysql`连接MySQL数据库的关键知识点: 1. **安装**:首先,你需要通过pip来安装`pymysql`库。在命令行中输入`pip install pymysql`即可完成安装。 2. **连接数据库**:在Python中,...

    python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py

    在使用Python 3.7.4版本时,尝试导入numpy库时遇到了错误提示,报错文件位于lib\site-packages\numpy\__init__.py中。错误的根源可能是由于numpy库版本不兼容或缺失某些必要的文件。根据提供的文件内容,解决该问题...

    Python库 | gocomics_downloader-1.1.1-py2.py3-none-any.whl

    Python库的使用通常涉及到以下知识点: 1. **Python虚拟环境(Virtual Environment)**: 在开发Python项目时,为了避免不同项目间的依赖冲突,我们通常会创建虚拟环境。使用 `venv` 或 `virtualenv` 工具可以轻松...

    Python库 | Flask_Docs-0.1.5-py2.py3-none-any.whl

    **标签中的知识点** - **Python**:这表明`Flask_Docs`是用Python语言编写的,符合Python的编程规范和习惯。 - **Flask**:`Flask_Docs`是Flask框架的扩展,专为Flask应用设计。 - **开发语言**:强调`Flask_Docs`...

    python 包引用的问题

    本篇文章将深入探讨Python包引用的相关知识点,帮助你解决在实际开发中可能遇到的问题。 1. **包的创建与结构** Python中的包通常是一个含有`__init__.py`文件的文件夹。这个特殊的`__init__.py`文件告诉Python,...

    road_segmentation_roadsegmentation_TheNetwork_python_CNN_

    综合以上,本项目涉及的主要知识点包括: 1. 道路分割(Road Segmentation):这是一个计算机视觉任务,目标是精确地识别图像中的道路区域。 2. 卷积神经网络(CNN):深度学习模型,适用于图像处理,特别是分类和...

    odoo 14 开发入门教程,官网文档翻译后入门教程

    知识点一:Odoo 14 开发环境搭建 * 需要在 Win10 环境下搭建 Odoo 14 开发环境 * 参考文章“基于 Win10 搭建 Odoo14 开发环境搭建” * 搭建环境包括安装 Python、pip、Odoo 等组件 知识点二: Odoo 14 模块架构 ...

    beginners_python_cheat_sheet(python知识点卡)

    **Python基础知识** ...这些初级Python知识点卡片提供了快速参考,帮助初学者快速掌握Python核心概念并逐步深入到更复杂的领域。通过不断实践和查阅相关资源,你可以成为一名熟练的Python开发者。

    python 一个能彻底理解包、模块引入的核心概念(csdn)————程序.pdf

    这里的关键知识点在于理解Python的模块查找机制,包括绝对导入和相对导入。绝对导入是基于Python解释器的全局`sys.path`来查找模块,而相对导入则基于当前模块的路径。`__init__.py`文件的存在使得文件夹成为合法的...

    Day31-40_python100_python_40_

    在“Day31-40_python100_python_40_”这个压缩包中,我们看到的是一个...以上就是“Day31-40_python100_python_40_”压缩包中涵盖的Python进阶知识点,通过这10天的学习,学员将能够对Python有更深入的理解和应用能力。

    学学Python_38类_04 超类

    总的来说,这些文件涵盖了Python面向对象编程的基础,包括类的定义、超类与子类的关系、方法的覆盖、以及Python内置类型的操作,这些都是编写复杂程序时不可或缺的知识点。通过深入学习和实践,开发者可以更好地利用...

    Python库 | schul_cloud_ressources_server_tests-1.0.6.tar.gz

    下面将详细讨论Python库、开发语言Python以及与测试相关的知识点。 Python库是Python编程语言中的一组预定义函数和模块,它们提供了特定功能,可以帮助开发者快速构建应用,而无需从零开始编写所有代码。Python库...

    python import

    以下是一些关于如何在Python中正确导入跨文件夹的.py文件的相关知识点: 1. **模块搜索路径**: Python在尝试导入模块时,会遵循一个预定义的搜索路径,这个路径由`sys.path`变量存储。`sys.path`包括当前目录、...

    Python库 | hhcp-0.1.2-py2.py3-none-any.whl

    在本文中,我们将深入探讨标题为"hhcp-0.1.2-py2.py3-none-any.whl"的Python库,以及与之相关的知识点。 首先,这个文件名称暗示了它是一个Python的 wheel 文件,它是Python的一种二进制分发格式。Wheel 文件的扩展...

    第10章 模块.pptx

    ### 第10章 模块知识点详解 #### 一、模块的基本使用 在Python中,模块是用来组织代码的一种方式,可以提高代码的...以上是关于Python中模块的基本使用、制作、包的概念以及模块发布的详细知识点。希望对您有所帮助。

    大三下学期期末复习.zip

    │ │ │ │ │ │ __init__.py │ │ │ │ │ │ │ │ │ │ │ └─__pycache__ │ │ │ │ │ spiderYichangGuishi.cpython-35.pyc │ │ │ │ │ __init__.cpython-35.pyc │ │ │ │ │ │ │ │ │ └...

Global site tag (gtag.js) - Google Analytics