Python中的包ImportError

前言

Python中的包给我提供了很好的代码组织,类似的功能模块放在同一个包内,不只代码结构清晰,并且调用起来也比较方便(能够用*导入)html

可是,咱们在刚开始使用Python包的时候老是会遇到导入错误"ImportError: No module named 'xxx'“,下面咱们来简单介绍一下如何解决这类问题python

 

Python中的包

Python中的包就和C#中的dll同样都是一些模块(或者类库)的集合。Python中新建立的包其实只有两个文件,一个是以包名命名的文件夹和其中的一个__init__.py文件(包的标识,能够到我以前的文章查看该文件的具体做用 http://www.cnblogs.com/AlwinXu/p/5598543.html )。既然了解了包的定义,那么咱们如何引用包呢?在引用以前咱们须要知道:app

  1. 包是否为有效的包(用__init__.py标识)
  2. 包的路径在哪?是否添加到sys.path?
  3. 包中是否有要导入的模块
  4. 包的__init__.py中__all__是否包含要使用的模块(针对用from package import *导入的状况)

因此,当再次遇到导入错的时候,咱们只须要检查以上四点,基本上能解决大部分的问题。spa

实例

首先我建立了包含两个包的工程,目录结构以下:code

下面咱们来看一下包导入的各类状况:htm

  • 导入python自带包或外部包

    Python自带包能够直接用import package或者from package import module来进行导入,觉得自带包都存在于系统包路径中,能够经过sys.path来查看:blog

>>> import sys
>>> sys.path
['', '/Users/xualvin/anaconda/lib/python35.zip', '/Users/xualvin/anaconda/lib/python3.5', 
'/Users/xualvin/anaconda/lib/python3.5/plat-darwin', '/Users/xualvin/anaconda/lib/python3.5/lib-dynload',
'/Users/xualvin/anaconda/lib/python3.5/site-packages',
'/Users/xualvin/anaconda/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg',
'/Users/xualvin/anaconda/lib/python3.5/site-packages/aeosa',
'/Users/xualvin/anaconda/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg']

    第三方python包路径须要添加到sys.path或者复制到已有sys.path中才能够正常导入。使用sys.path.append("path_to_third_party_packages")进行添加ip

  • 导入本工程中的包

    如在上图包结构中的RootMain.py中导入Pack1,Pack1.SubPack和Pack2中的模块:pycharm

from Pack1 import *
from Pack1.SubPack1 import SubPack1_Module
from Pack2 import Pack2_Module

Pack1_Module.ModuleInfo()
SubPack1_Module.PrintInfo()
Pack2_Module.ModuleInfo()

其中Pack1中的__init__.py定义了__all__:it

__all__ = ["SubPack1_Module"]

 

  • 导入父包中的模块

    导入父包中的模块,好比在Pack1.SubPack1中的SubPack1_Module.py调用Pack1中的Pack1_Module.py模块:

from Pack1 import Pack1_Module
def Pack1Module():
    Pack1_Module.ModuleInfo()

 

  • 导入子包中的模块

    好比在Pack1_Module中导入SubPack1中的SubPack1_Module:

from Pack1.SubPack1 import SubPack1_Module

def InvokeSubPack1():
    SubPack1_Module.PrintInfo()

 

  • 导入兄弟包中的模块

    这部分其实和第三方包的导入相似,咱们须要将兄弟包导入到sys.path中,好比在Pack2中调用Pack1:

    首先,在Pack2中导入Pack1的包路径,在Pack2中的__init__.py中导入(pycharm好像不须要这一步,VS2013的工程须要,不过加上没有什么错):

import sys

sys.path.append("/Users/xualvin/Bokeyuan/Pack1")

    其次在Pack2中的模块中调用Pack1,导入方式和Python自带包同样:

from Pack1.SubPack1 import SubPack1_Module
from Pack1 import Pack1_Module

def InvokePack1():
    Pack1_Module.ModuleInfo()
    SubPack1_Module.PrintInfo()

总结

Python中的包导入咱们只须要注意两点:一是导入的是否是包,二是导入的包路径是否可以被找到(sys.path或者本工程中),只要平时写程序的时候多注意,确定能够避免不少麻烦。

相关文章
相关标签/搜索