前言

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

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

Python中的包

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

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

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

实例

首先我创建了包含两个包的工程,目录结构如下:

下面我们来看一下包导入的各种情况:

  • 导入python自带包或外部包

    Python自带包可以直接用import package或者from package import module来进行导入,以为自带包都存在于系统包路径中,可以通过sys.path来查看:

>>> 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")进行添加

  • 导入本工程中的包

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

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__:

__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或者本工程中),只要平时写程序的时候多注意,肯定可以避免很多麻烦。

Python中的包ImportError的更多相关文章

  1. python中引入包的时候报错AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法?

    python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdef ...

  2. [转]Python中出错:ImportError: No module named win32com.client

    Python中出错:ImportError: No module named win32com.client [问题] [已解决]Python中处理操作Excel中的图表(Chart,Graph) 的 ...

  3. [Python]Python中的包(Package)

    参考官方文档中的Module和Glosssary中的描述.Module: https://docs.python.org/3/tutorial/modules.html#packagesGlossar ...

  4. 关于python中的包,模块导入的问题详解(一)

    最近由于初学python,对包,模块的导入问题进行了资料的搜集,查阅,在这里做一个总结: 一: import 模块 在import的过程中发生了什么?我们用一个实验来说明: 以上截图表明:在impor ...

  5. 菜鸟教程-python中的包

    转载自:http://www.runoob.com/python/python-modules.html 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python ...

  6. python中模块包的离线下载教程

    1.简介 当我们进行Python项目的迁移时(例如迁移到另外一台服务器上),如果该服务器要求离线安装, 往往需要我们将项目中的所需模块包进行离线操作. 2.教程 2.1 首先安装pip2pi模块,它可 ...

  7. 关于python中的包,模块导入的问题详解(二)

    from import导入 紧接着的是from xx import xx  语法 1 ################ 2 from my_moudule import name 3 print(na ...

  8. python中的包和文件夹的区别

    python的模块,就不得不说包(package),package是module的集合,在一个package中有很多的module, 还是以之前的index.py与baiduHq.py模块为案例,说明 ...

  9. Python中常用包——sklearn主要模块和基本使用方法

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

随机推荐

  1. Win10 1803 升级之后无法使用 共享目录的解决方法

    1. 自己的虚拟机升级了win10 最新版本 1803 但是发现 使用共享文件夹时报错: 2, 百度发现解决方案还是非常简单的. 需要安装一个 功能 3.方法: 开始 运行 输入 control 打开 ...

  2. jquery中append、prepend, before和after方法的区别

    1.prepend() .append()方法在被选元素的开头/结尾插入文本/HTML: 2.before().after()方法在被选元素之前/之后插入内容: append() & prep ...

  3. 重温Delphi之:面向对象

    任何一门语言,只要具备了"封装,继承,多态"这三项基本能力,不管其实现方式是直接或曲折.复杂或简洁,就可以称之为“面向对象”的语言. Delphi当年的迅速走红,是以其RAD快速开 ...

  4. DTD举例一

    DTD举例一: <!--动作库约束文件--> <!DOCTYPE actionGroup [ <!ELEMENT actionGroup (action*)> <! ...

  5. 洛谷 P4294 [WC2008]游览计划

    题目链接 不是很会呢,但似乎抄了题解后有点明白了 sol:状态DP显然,其实是要构建一棵最小生成树一样的东西,我自己的理解(可能不是很对哦希望多多指教)f[x][y][zt]就是到x,y这个点,状态为 ...

  6. AC自动机-HDU2896-模板题

    http://acm.hdu.edu.cn/showproblem.php?pid=2896 另一道AC自动机的模板题,不过这题需要记录一下具体的匹配情况. /*------------------- ...

  7. 聪聪和可可 HYSBZ - 1415(概率 + spfa + 记忆化dp)

    Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每 ...

  8. day11 内置函数

    特殊算数运算 计算整数的和 l = [1,2,3,4,5] print(sum(l)) 除法运算,然后取余 在做页面的时候可以根据数据量分页的时候使用 print(divmod(10,3)) # (3 ...

  9. MT【51】一道三角求最值问题

    [Genius is one percent inspiration and ninety-nine percent perspiration]--- 爱迪生 [Without the one per ...

  10. 创建首个 Android 项目

    Android 项目包括构成你的 Android 应用的源代码的所有文件. 利用 Android SDK 工具可以简单的创建 默认项目目录和文件来开始一个新的 Android 项目. 本节课展示了如何 ...