zoukankan      html  css  js  c++  java
  • python导入模块总结与分析

    定义1:python中什么是模块? 答:模块就是一个.py文件,每一个以py作为后缀的文件,都是一个模块。

    定义2:Python中什么是包? 答:包是一类特殊的模块,他能包含其他模块,为了更好的组织模块而出现,称为包。需要注意的是,希望python认为这个模块是包的话,这个模块必须包含一个名为__init__.py的模块。假设包名为package,import package时,首先会执行—__init__.py中的内容

    《Python基础教程》对于第十章“自带电池”中对于模块介绍的标题为

    - 模块是程序(代表导入模块时会执行模块的内容,相当于执行了一段程序)

    - 模块用于定义(代表可以在模块中定义变量和函数,可以加强代码重用)

    - 让你的模块可用(后面详细讲解,会有扩展,主要内容)

    sys.path - 寻找模块时的搜索路径

    python处理模块有一定的机制,模块的搜索路径存储在sys.path中,通过打印该变量,我们可以看到一些内容,例如我的是:

    >>> import sys, pprint
    >>> pprint.pprint(sys.path)
    ['',
     'D:\anaconda\python27.zip',
     'D:\anaconda\DLLs',
     'D:\anaconda\lib',
     'D:\anaconda\lib\plat-win',
     'D:\anaconda\lib\lib-tk',
     'D:\anaconda',
     'D:\anaconda\lib\site-packages',
     'D:\anaconda\lib\site-packages\Sphinx-1.5.1-py2.7.egg',
     'D:\anaconda\lib\site-packages\thrift-0.10.0-py2.7.egg',
     'D:\anaconda\lib\site-packages\win32',
     'D:\anaconda\lib\site-packages\win32\lib',
     'D:\anaconda\lib\site-packages\Pythonwin',
     'D:\anaconda\lib\site-packages\setuptools-27.2.0-py2.7.egg']

    每个人的sys.path都不太相同,这取决于你的python安装方式,由于我是使用anaconda进行安装的,所以很多路径与anaconda相关。需要稍微强调的是

    - lib和site-packages,一般的模块都在这里能够找到,使用pip进行安装的时候,大多数也是进入site-packages目录下。因此为了让你的模块可用,可以尝试把你的模块放在这些目录下面。

    - 模块的搜索过程是从sys.path中遍历搜索是否存在该模块,找到第一个就直接返回,因此同名模块有可能在搜索过程中被覆盖。这也是为什么当前路径总是在sys.path第一个位置的原因。如果本地统计目录定义了一个模块,搜索时会第一个从本地搜索到。

    导入自定义模块的一般方法

    除了专门开发python模块的人,我们在使用python时,不会把模块都写在sys.path中系统指定的那些位置,未免有些太麻烦了。我们会有自己的working directory,所有的模块都在这里。如何在这种情况下导入模块。下面分几种情况进行分析。

    我的本地文件结构:

    - 导入同级目录下的模块

      例如,从parent_module.py 中导入parent_module2.py,只需要 import parent_module2.py

    # content in parent_module.py file
    name = 'parent_module'
    print 'I am', name
    import parent_module2
    
    # content in parent_module2.py file
    name = 'parent_module2'
    print 'I am', name

      执行 python parent_module.py 得到:

    PS E:workspace_vsimport_test> python .parent_module.py
    I am parent_module
    I am parent_module2

    - 导入子级目录下的模块

      也很简单,例如从parent_module.py中导入pson_module.py,只需要 import parent_package.pson_module.py

    # content in parent_module.py
    name = 'parent_module'
    print 'I am', name
    import parent_package.pson_module
    
    # content in parent_package.pson_module.py
    name = 'pson_module'
    print 'I am', name

      执行 python parent_module.py 得到:

    PS E:workspace_vsimport_test> python .parent_module.py
    I am parent_module
    I am pson_module

    - 导入父级目录下的模块

      这个就有点意思了,先说正确的方式,为了让系统搜索到父级的模块,首先需要找到父级目录的地址,一行代码sys.path.append('..')

      但是注意:上面append('..')方法将上级目录加入path中,但是这个上级是相对于谁呢?应该是python的working directory,所以想要保证正确执行需要直接python .parent_module.py,而不能再其它路径执行该文件

      另外,执行一个python文件的时候,无论working directory是哪里,都会把该python文件(模块)所在的目录添加在sys.path中的第一项。

    后面重点在于讲解relative import 和 absolute import

    未完待续。。。

  • 相关阅读:
    js回车键事件
    legend3---15、像粉丝数、关注数、课程数等数量数据如何处理
    Jquery.Data()和HTML标签的data-*属性
    php判断两个数组是否相等
    安卓Android控件ListView获取item中EditText值
    ubuntu安装和查看已安装
    Remove “System Program Problem Detected” Messages From Ubuntu
    Genymotion
    Genymotion中文手册
    sudo apt-get install lib32stdc++6
  • 原文地址:https://www.cnblogs.com/chen-kh/p/7277613.html
Copyright © 2011-2022 走看看