Python中的包ImportError

前言

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

时间: 2024-10-14 22:24:43

Python中的包ImportError的相关文章

3. python中的包和库

3.1模块和包的概念 当代码越来越多时,当把所有的代码都集中于一个文件中时,难以维护 将代码分开放在不同的py文件中,易于维护,同一名字的变量和函数互不影响 如 #a.py x=5 def f1(): pass #b.py x='str' def f1(iterable): pass a.py和b.py中变量和函数互不影响 将a.py称为模块a,将b.py称为模块b,可见,模块的名字就是.py文件的名字 引入第三方的模块 #test.py import math print math.pow(2

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

python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdefaultencoding('utf-8') AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法: 1.python2中解决方法:reload(sys)sys.setdefaultencoding('utf-8'

使用Python中NetworkX包绘制深度神经网络结构图

1 """ 使用Python中NetworkX包绘制深度神经网络结构图 """ 2 # 导入相应包 3 import networkx as nx 4 import matplotlib.pyplot as plt 5 6 # 创建DAG 7 G = nx.DiGraph() 8 9 # 创建结构图顶点列表 10 vertex_list = ['v'+str(i) for i in range(1, 22)] 11 12 # 添加结构图顶点 13

python中的包

python中的包通俗来讲是一系列模块文件的组合,在一个文件夹内,这个文件夹就是就是包. 首次导入包: 产生一个执行文件的名称空间:1,创建包下面的__init__.py文件的空间名称.2,执行包下面的__init__.py文件中的代码,将产生发名称放入包下面的__init__.py文件名称空间中.3,在执行文件中拿到一个指向包下面__init__.py文件名称空间的名字.下图是包在pycharm中创建的步骤.创建完成之后会在文件下自动生成一个__init__.py文件. __init__.py

python中的包和文件夹的区别

python的模块,就不得不说包(package),package是module的集合,在一个package中有很多的module, 还是以之前的index.py与baiduHq.py模块为案例,说明包的使用,新建baidu包,切记包与文件夹最明显的 区别是包有__init__,而文件夹没有,见下图 新建baidu和index两个包,分别编写baiduHq.py和index.py 那在index包下的index.py怎么调用baidu包下的baiduHq.py中的函数,类了?见实现的过程 原文地

Python中关于包的的定义

如果一个文件夹中有 __init__.py这个文件 ,那么这个文件夹就可以被称为包. 那么什么是包?(多个模块组成,即.py文件) 但是对于Python2 和 Python3的区别 当导入模块时  可以写成 from. import  模块名(点的意思指的是:当前路径下) -----------------------------------------------------------------------------------------------------------------

Python中导入包中模块的方法及区别

如果我们要使用一个package中定义的一个module,有两种导入方式 方法1: from package import module 方法2: import package import package.module 这两种方法的区别是通过方法1导入后,程序中可以直接使用module短命,而通过方法2导入后,程序中必须使用完整名称,即通过package.module使用,如果只导入package而不导入module,那么只有package中定义的__init__.py模块中的内容可用(使用该

python中黏包现象

#黏包:发送端发送数据,接收端不知道应如何去接收造成的一种数据混乱现象. #关于分包和黏包: #黏包:发送端发送两个字符串"hello"和"word",接收方却一次性接收到"helloword" #分包:发送端发送字符串"helloword",接收方却受到了两个字符串"hello"和"word" #虽然socket环境有这些问题,但是TCP传输数据能保证几点: #顺序不变,发送端发送he

python中不同包之间调用方法、

在pycharm中... 当两个py文件在同一个文件夹下的时候.直接from 文件名 import *  即可 当两个文件在不同的文件夹下的时候.需要在文件中加入 _init_.py 文件.里面可以什么也不用写.但是需要有这个文件. 然后 import 文件夹名.py文件名  import  *  就可以调用不同文件夹下的 A文件夹 B文件夹 _init_.py D.py c.py e.py c中导入e: from e import * c中导入D: from B文件夹.D import * D