“ImportError:没有名为”的模块“错误似乎与我的代码无关

时间:2011-09-09 19:18:22

标签: python python-module

我正在尝试完成学习Python艰难之路,第2版Exercise 47,但我在运行tests/ex47_tests.py时收到此错误:

File "tests/ex47_tests.py", line 3, in <module>
    from ex47.game import Room
ImportError: No module named ex47.game

我认为这是我在代码中出错的原因,因为我对此很新,所以我从似乎已经成功完成练习的GitHub用户克隆了this repo

我们的代码的相关部分不仅相同,而且当我尝试运行从他克隆的tests/ex47_tests.py时,我收到相同的错误。所以现在我迷失了,并希望有人为我找到解决方案。有什么想法吗?

6 个答案:

答案 0 :(得分:5)

fabrizioM的回答应该让它发挥作用。这是一个小解释。

当Python加载文件时,它会搜索文件系统。所以在这里,我们有import语句:

from ex47.game import Room

它在模块搜索路径中查找文件ex47.py(在Python代码中可以作为sys.path访问)。模块搜索路径包含一些基于Python的安装详细信息的目录,PYTHONPATH环境变量中列出的目录,并包含您正在执行的脚本的父目录。它在路径上找不到ex47.py,但它看到有一个名为ex47的目录,里面有__init__.py。然后它在该文件夹中找到game.py。

问题是您当前的文件夹不在模块搜索路径上。因为运行了ex47_tests.py,所以它在路径上有$ cwd / tests。你需要路径上的$ cwd。

PYTHONPATH=. python tests/ex47_tests.py

正是如此。它将$ cwd放在模块搜索路径上,以便Python可以找到源文件。

你也可以这样做:

python -m tests.ex47_tests

这会将它作为模块而不是文件运行,而它将使用当前目录作为自动添加到模块搜索路径的路径,而不是文件所在的目录。

答案 1 :(得分:3)

来自存储库目录的

PYTHONPATH=. python tests/ex47_tests.py

确保路径中没有其他ex47.py文件/包。

答案 2 :(得分:3)

这本书要求你复制骨架&#39;目录,然后将其用于游戏室练习(#47)。骨架目录有一个&#34; NAME&#34;目录。

因此,如果您复制了骨架目录并将其命名为ex47,那么您将在其中拥有另一个ex47目录。

lpthw > ex47 > ls
bin     docs        ex47        setup.py    tests

所以,当这本书说&#34; 接下来,创建一个简单的文件ex47 / game.py,你可以把代码放到测试&#34;,你认为它是顶级的等级ex47。不正确!这就是导入无法解决的原因。

我也遇到了同样的问题,直到我意识到这本书将外部目录(我们通过复制&#39;骨架&#39;)称为简单游戏&#39;从书中的这一行可以看出 -

~/projects/simplegame $ nosetests

所以关于PYTHONPATH的所有答案都是有效的,我只想解释为什么导入不适合你!

答案 3 :(得分:1)

您的目录结构有问题。这是我的目录结构:

bin  docs  ex47  setup.py  tests

./bin:

./docs:

./ex47:
game.py  game.pyc  __init__.py  __init__.pyc

./tests:
ex47_tests.py  ex47_tests.pyc  __init__.py  __init__.pyc

答案 4 :(得分:0)

该项目名为ex47,其中有一个名为ex47的文件夹。 (假设您根据本练习中game.py文件代码之前的计划命名了您的文件) 当作者说创建一个简单的文件ex47 / game.py时,他的意思是其中的文件夹是应该创建和存储game.py文件的地方。

答案 5 :(得分:-1)

我也有同样的错误;作为python的新手,我按照书中的例子,在复制了骨架目录之后,重命名了包含'NAME'的任何文件 - 一个存在于test /目录中,一旦删除了无法加载错误消失了 - 检查Microivan中的答案/内容上面的目录帖子。 所以在项目目录中只应该存在两个python文件,game.py和ex47_tests.py - 希望你到那里,继续下一个练习。!!