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

python中的module相关推荐

  1. python中模块(Module)和包(Package)的区别 (导入模块、导入包)(import导包)

    如下结构,mycompany就是包,abc.py和xyz.py就是模块 mycompany ├─ __init__.py ├─ abc.py └─ xyz.py 参考文章:Python中模块(Modu ...

  2. Python中模块(Module)和包(Package)的区别

    1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个 ...

  3. python中自定义module的方法及注意事项

    在编写python程序的过程中,不可避免的需要自定义一些python的类和函数.有时候定义的函数太多,就要根据用途放到不同的module(模块)中去,项目更大时,需要将这些module再分类,放到不同 ...

  4. python中module什么意思_在Python中,module

    我有3个文件,factory_imagenet.py.imdb.py和imagenet.py factory_imagenet.py有:import datasets.imagenet 它还有一个函数 ...

  5. python的使用说明_Python教程:Python中__init__.py的使用用法说明

    Python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的 ...

  6. 【Python】 -- from module import * 、from module import function 与 import module

    import module 导入Python标准库或者第三方库,导入之后可以通过以下语法调用库中的函数.此方法会导入module中的所有函数方法,可能会占用较大的不必要的空间以及load时长增加. i ...

  7. python中的const_Python实现Const详解

    python语言本身没有提供const,但实际开发中经常会遇到需要使用const的情形,由于语言本身没有这种支出,因此需要使用一些技巧来实现这一功能 定义const类如下 复制代码 代码如下: imp ...

  8. python中module用法_Python学习之module用法

    Python学习之module用法 Python学习之module用法 为什么80%的码农都做不了架构师?>>> Python has a way to put definition ...

  9. python中module_Python中的模块(Module)

    与在控制台输入python程序,执行命令相比.当我们的程序变得越来越长的时候,我们希望可以在文本编辑器(如sublime text, notepad++)中编写python程序,因为这样的话,我们的程 ...

最新文章

  1. PHP 函数 ignore_user_abort定时执行任务的实现
  2. 【ASP.NET北大青鸟】-总结(二)
  3. SpringMVC+HibernateValidator,配置在properties文件中的错误信息回显前端页面出现中文乱码
  4. [我的1024开源程序]600元WORD公文校对器插件
  5. MySQL-02:“数据库”操作基本命令及权限笔记
  6. 计算机视觉书籍学习记录——1最近点匹配
  7. sql还原数据库备份数据库_有关数据库备份,还原和恢复SQL面试问题–第二部分
  8. python代码中函有中文报错的解决方法
  9. urlrewrite配置
  10. O、Θ、Ω、o、ω,别再傻傻分不清了!
  11. 阿里云centos 7下kubeadm方式安装kubernetes 1.14.1集群(包含解决墙以及各种坑的问题)
  12. win下装django
  13. 跨省游恢复!酒店行业怎么利用小程序抓住机会,应该做哪些?
  14. 教师计算机提升工程培训心得,教师信息技术应用能力提升培训心得体会3篇
  15. Task 1 知识图谱介绍
  16. 奥利给,圣诞树,圣诞快乐
  17. 观《我想吃掉你的胰脏》的一些看法
  18. 概率统计——概率论与数理统计
  19. Hive转换常用函数
  20. 简介vsftpd及搭建配置

热门文章

  1. 在DataGrid中显示图片
  2. MFC给按钮添加皮肤
  3. C++11中std::packaged_task的使用
  4. Ubuntu下使用CMake编译OpenSSL源码操作步骤(C语言)
  5. C++11中std::lock_guard的使用
  6. 【Qt】QStackedWidget:将多个窗口控件放入堆中,每次只显示一个窗口控件
  7. 【经验】提高github的下载(克隆)速度
  8. 服务器性能好的笔记本电脑,2020高性价比笔记本推荐-1万以上笔记本电脑排行
  9. android命令行工具 混淆,Android 混淆代码学习以及Android加密工具--APKProtect的使用ZZ...
  10. 汉字笔画数据_统计学原理 数据的预处理