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

问题描述 投票:4回答:6

我正在尝试完成学习Python困难之路的第二版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时收到同样的错误。所以现在我迷失了,并希望有人为我找到解决方案。有任何想法吗?

python python-module
6个回答
3
投票

从存储库目录:

PYTHONPATH=. python tests/ex47_tests.py

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


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

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


3
投票

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

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

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

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

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

~/projects/simplegame $ nosetests

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


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

0
投票

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.