我正在尝试完成学习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
时,我收到相同的错误。所以现在我迷失了,并希望有人为我找到解决方案。有什么想法吗?
答案 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 - 希望你到那里,继续下一个练习。!!