Python错误:ImportError:无法导入名称Akismet。

12

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

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

from akismet import Akismet
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name Akismet
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错误:ImportError:无法导入名称X

实际的问题,正如Doppelganger所指出的那样,是Python解释器优先搜索你创建的软件包目录中命名为X的文件/模块,并忽略实际的strategy.py模块中的函数/类X,而这是你实际上正在寻找的内容。

如果你像我一样,在中途改变主意,可能会让你感到困惑。这正是你在阅读Python软件包文档时所期望并需要的,但如果你半途而废,就像我一样,你可能会为此困惑不解。


1
还要检查残留的*.pyc文件,因为即使*.py文件已经不存在,Python也会导入这些文件。pyc是我生命中的噩梦! - Rebs

6
如果您的PYTHONPATH正确且全局设置,它将完美地工作(我刚刚测试过)。
  • 必须设置为包含“akismet.py”的目录,而不是文件路径!确保您不使用相对路径。
  • 请注意,您可能需要重新启动/注销以便将环境变量更改应用于所有程序。

假设我在PYTHONPATH中有路径/path/,然后我尝试使用/path/akismet/akismet.py(添加__init__.py),并尝试使用/path/akismet.py,但都没有成功。 - Doppelganger
@Doppelganger: 将“akismet.py”脚本放置在“/path/”中,并将该路径添加到您的PYTHONPATH中。如果您的PYTHONPATH中有多个目录,请使用冒号作为分隔符。重新启动计算机并使用“set”命令检查PYTHONPATH是否正确。然后它肯定会正常工作。 - AndiDog
1
好的,这里的真正问题是我将akismet文件夹标记为一个包添加在_init_.py中,我删除了那个文件夹,现在它可以正常工作了。 - Doppelganger
10
除了建议人们重新启动来应用环境变量更改之外,这是一个好答案。重启应用程序可以,但不需要重新启动操作系统内核和固件。 - mikemaccana

4

请检查您的PYTHONPATH是否符合您的期望,例如通过在交互式控制台中执行以下操作:

In [1]: import sys

In [2]: print sys.path

akismet.py 真的在这些文件夹中吗?

2
你需要将包含'akismet'目录的文件夹添加到路径中。我猜你已经将'akismet'目录本身添加到了$PYTHONPATH中。
当你写下以下代码时:
from akismet import Akismet

Python试图在其搜索路径中打开文件akismet/Akismet.py

这一切都假设Akismet是一个文件,而akismet是一个目录。如果存在akismet.py文件,则包含该文件的目录应列在$PYTHONPATH中。


假设我在PYTHONPATH中有路径/path/,然后我尝试使用/path/akismet/akismet.py(添加__init__.py),并尝试使用/path/akismet.py,但都没有成功。 - Doppelganger

1

简单:

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

现在运行您的应用程序,您应该可以正常使用。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接