Python中的Module是比较重要的概念。常见的情况是,事先写好一个.py文件,在另一个文件中需要import时,将事先写好的.py文件拷贝到当前目录,或者是在sys.path中增加事先写好的.py文件所在的目录,然后import。这样的做法,对于少数文件是可行的,但如果程序数目很多,层级很复杂,就很吃力了。
有没有办法,像Java的Package一样,将多个.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
当然,在Python 2.5中,有更简单的办法:
from .. subPack1.module_11 import funcA
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1182018
分享到:
相关推荐
10. **Python的应用场景**:Python广泛应用于Web开发、数据分析、人工智能、自动化脚本、网络爬虫等领域,是现代技术栈中不可或缺的一部分。 这份"python基础笔记html"很可能是对以上内容的详细阐述,通过阅读和...
"Python核心笔记"是对Python编程基础知识的深入探讨,旨在帮助学习者掌握Python语言的关键概念,理解其工作原理,并避免在编程过程中常见的错误。这份笔记涵盖了Python的核心特性,包括但不限于数据类型、控制结构、...
### Python入门笔记知识点详解 #### 一、热身 - 为什么选择Python? Python是一种流行的、通用的编程语言,因其简洁的语法和强大的功能而受到广大程序员的喜爱。在选择Python作为学习对象时,以下几点特性非常突出...
Python的交互式编程可以在IDLE(Python自带的集成开发环境)中进行。通过IDLE可以打开Python的命令行窗口,输入命令行语句并立即看到执行结果。例如,输入print('hello cainiao!')即可输出字符串“hello cainiao!”...
12. **模块(Module)**:模块是Python代码的组织形式,通常以`.py`结尾,包含了数据、函数和类。通过`import`导入模块,可以复用代码并保持代码结构清晰。 13. **包(Package)**:包是模块的进一步组织,以文件夹形式...
Python作为一种强大的、易读性强的编程语言,广泛应用于数据处理、Web开发、科学计算等领域。通过本教程的学习,你将能够熟练运用Python进行各种编程任务。 ### 1. Python基本语法 - **变量与数据类型**:Python中...
- **IDLE**: 是Python自带的一个集成开发环境,提供了图形界面和命令行两种模式。 - **启动方式**: 在Python安装目录下查找`IDLE`程序并打开,即可进入Python命令行环境。 - **交互式编程**: 可以直接在命令行窗口...
Python使用模块(module)来组织代码,通过`import`语句引入。包是模块的容器,用点号(.)分隔层次。 **八、异常处理** Python使用try-except语句处理程序运行时可能出现的错误,提高程序的健壮性。 **九、面向...
《Python开发技术详解》笔记1 在Python编程领域,深入理解和掌握基础知识是至关重要的。本笔记将详述Python的一些核心概念,包括面向对象特性、注释、语句分隔、变量作用域,以及后续章节中涉及的控制语句、模块与...
模块(Module)部分讲解了如何导入和使用模块,如何创建自定义模块,以及Python标准库中的sys模块、random模块等。 异常处理(exception)是编写健壮程序不可或缺的一部分。笔记中讲解了try语句、raise语句、assert...
在Python的学习过程中,掌握一系列关键知识点至关重要,这些知识点构成了Python语言的基础,也是进阶开发的基石。本笔记将详细讲解Python的基本语法、数据类型、控制结构、函数、模块化编程以及错误与异常处理等方面...
- **命令行方式**: Python 提供了一个名为 IDLE 的集成开发环境(IDE),用户可以通过它启动 Python 的命令行界面。在这个环境中,你可以直接输入 Python 代码并立即看到结果。这种方式非常适合初学者学习和测试代码...
从给定的文件信息来看,这是一份详细的Python学习笔记,涵盖了从基础语法到高级特性,包括数据类型、控制结构、函数、模块、类与对象、异常处理等多个方面。下面,我们将对这份学习笔记中的一些关键知识点进行深入...
3. **框架开发**:许多流行的Web框架(如Django和Flask)都是基于Python构建的。 #### 四、Python的解释器实现 1. **CPython**:这是Python最原始也是最常用的实现方式。 2. **Jython**:针对Java平台的Python实现...
本文将深入探讨"PythonNotes:Python3学习笔记"中的关键知识点,帮助初学者或进阶者更好地掌握Python3的核心概念。 ### 1. 基本语法 Python3的语法简洁明了,以缩进来表示代码块。变量声明无需指定类型,动态类型...
### 超详细的Python学习笔记知识点汇总 #### 1. Python基础语法与概念 ##### 1.6 语句 - **表达式计算**: Python解释器可以用来做简单的计算器操作,例如 `2 * 2` 结果为 `4`。 - **`print()` 函数**: 可以用来...
在Python编程中,模块是代码组织的...40. **pygccxml**、**pyparsing**、**pymacs**、**idapy**、**pythonpaimei**、**pyLucene**、**wikidpad**、**Karrigell**等:这些是其他一些Python库或工具...
"Curso-python:python的英语翻译"可能是指一个课程或教程,旨在帮助学习者理解Python编程语言的同时,熟悉相关的英文术语,这对于在全球范围内进行技术交流和学习最新的开发资源至关重要。 在Python的世界里,了解...
10. **模块(Module)**:Python的模块系统允许将代码组织到不同的文件中,通过导入import语句使用。学习如何创建和使用自定义模块或Python标准库中的模块。 在“ljg_resource”这个文件中,可能包含了上述概念的实例...