12

我见过许多类似的错误,但我看不到适用于我的特定问题的解决方案。

我正在尝试使用我的 PYTHONPATH 上的Akismet 模块,然后如果我启动交互式解释器,当我运行时 from akismet import Akismet(如文档字符串所述),我会收到以下错误:

from akismet import Akismet
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name Akismet
4

6 回答 6

15

我只是想提请更多注意Doppelganger自己对他的问题的回答。我有这个错误,情况是这样的:

您正在尝试从名为“strategy.py”的模块中导入函数/类 X。

不幸的是,您还创建了一个名为 strategy 的 python 包目录,换句话说,您有一个名为“strategy”的目录,在“strategy”目录中至少有一个名为“____init___.py”的文件。

root folder\
    strategy.py (contains function/class called X)
    strategy\
        __init__.py

然后,您忘记了您已经创建了 python 包目录这一事实,并尝试导入strategy.py在“根”目录中的文件中定义的某些类或函数,如下所示

from strategy import X

然后你得到的是Python error: ImportError: cannot import name X错误。

正如 Doppelganger 所指出的,实际问题是 python 解释器优先考虑您创建的包目录,并在包目录中搜索名为 X 的 FILE/MODULE ,并忽略实际的 modulestrategy.py和 function/class X其中,您实际上正在寻找。

如果您阅读有关 python 包的文档,这正是您所期望和想要的,但是如果您像我一样中途改变主意,您最终可能会摸不着头脑。

于 2011-09-18T09:56:30.063 回答
6

如果您的 PYTHONPATH 设置正确且全局设置(刚刚自己测试过),它将完美运行。

  • 必须设置为包含“akismet.py”的目录,而不是文件路径!确保不使用相对路径。
  • 请注意,您可能需要重新启动/注销才能将环境变量更改应用于所有程序。
于 2010-02-28T17:51:48.553 回答
4

检查您的 PYTHONPATH 是否真的是您所期望的,例如通过在交互式控制台中执行此操作:

In [1]: import sys

In [2]: print sys.path

akismet.py 真的在其中一个文件夹中吗?

于 2010-02-28T17:53:39.197 回答
2

您的路径中应该有包含“akismet”目录的目录。我猜,您已将“akismet”目录本身添加到 $PYTHONPATH。

当你写:

from akismet import Akismet

Python 尝试akismet/Akismet.py在其搜索路径中的某处打开文件。

所有这些假设Akismet都是一个文件并且akismet是一个目录。如果有akismet.py文件,则包含该文件的目录应列在$PYTHONPATH.

于 2010-02-28T17:52:00.753 回答
1

简单的:

  1. 确保您已安装 akismet(系统范围或 virtualenv)
  2. 通过将(导入 akismet)粘贴到 python shell 中进行验证
  3. CD 进入项目的根目录并运行(find .-name akismet.py
  4. 如果您找到具有该名称的文件,请查看是否可以重命名它
  5. 然后运行(find . -name akismet.pyc -print0 | xargs -0 rm -rf

现在运行您的应用程序,您应该一切顺利。

于 2013-01-13T21:05:46.510 回答
0

当您在 ipython 解释器中使用命令时,我总是忘记ipython 会导入模块。run它不会重新导入您更改的任何模块,因此不会找到任何新变量或函数。这是ipython的一个已知问题。

结论:避免使用run,因为它不会重新加载您的模块。

于 2013-04-15T16:47:41.153 回答