ImportError:cannot import name game

来源:互联网 发布:js下载 编辑:程序博客网 时间:2024/05/22 17:42

在学习《Learn Python the hard way》这本书的习题ex47的时候遇到这个问题,如图:

from ex47 import game


从包ex47中无法导入game.py文件,原因是ex47中缺少__init__.py文件,那它只是一个目录,不是一个包,所以导入失败。

下面是关于这个问题的整理:

创建一个名字为包名字的文件夹并在该文件夹下创建一个__init__.py 文件就定义了一个包。可以根据需要在该文件夹下存放资源文件、已编译扩展及子包。
包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法,其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。只要一个文件夹下面有个 __init__.py 文件,那么这个文件夹就可以看做是一个包,假如子目录中也有 __init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入的时候,实际上导入了它的 __init__.py 文件。

Graphics/
      __init__.py
      Primitive/
         __init__.py
         lines.py
         fill.py
         text.py

import语句使用以下几种方式导入包中的模块:
  1. import Graphics.Primitive.fill 导入模块Graphics.Primitive.fill,只能以全名访问模块属性,例如Graphics.Primitive.fill.floodfill(img,x,y,color)
  2. from Graphics.Primitive import fill 导入模块fill ,只能以 fill.属性名这种方式访问模块属性,例如 fill.floodfill(img,x,y,color)
  3. from Graphics.Primitive.fill import floodfill 导入模块fill ,并将函数floodfill放入当前名称空间,直接访问被导入的属性,例如 floodfill(img,x,y,color)




1 0
原创粉丝点击