4

我正在尝试完成Learn Python The Hard Way, 2nd Edition 的练习 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 用户那里克隆了这个 repo 。

不仅我们代码的相关部分相同,而且当我尝试运行tests/ex47_tests.py从他那里克隆的代码时,我也会收到相同的错误。所以现在我迷路了,希望有人能为我提供解决方案。有任何想法吗?

4

6 回答 6

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

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

于 2011-09-09T19:42:21.563 回答
3

从存储库目录:

PYTHONPATH=. python tests/ex47_tests.py

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

于 2011-09-09T19:33:58.877 回答
3

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

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

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

所以当书上说“接下来,创建一个简单的文件 ex47/game.py,你可以在其中放置代码进行测试”,你假设它是顶级 ex47。不正确!这就是导入无法解决的原因。

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

~/projects/simplegame $ nosetests

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

于 2015-02-20T18:10:18.603 回答
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
于 2013-06-17T14:26:32.713 回答
0

该项目名为 ex47,其中有一个名为 ex47 的文件夹。(前提是你已经根据他在本练习中的 game.py 文件代码之前制定的计划命名了你的文件)当作者说创建一个简单的文件 ex47/game.py 时,他的意思是其中的文件夹是 game.py 文件应该在的位置创建和存储。

于 2017-06-18T05:32:07.793 回答
-1

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

于 2017-12-28T18:13:24.233 回答