首页 文章

Python错误“ImportError:没有命名的模块”

提问于
浏览
335

Python安装在本地目录中 .

我的目录树如下所示:

(local directory)/site-packages/toolkit/interface.py

我的代码在这里:

(local directory)/site-packages/toolkit/examples/mountain.py

为了运行这个例子,我写了 python mountain.py ,在我的代码中:

from toolkit.interface import interface

我收到错误:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

我已经检查了 sys.path ,我的目录是 /site-packages . 另外,我在toolkit文件夹中有 __init__.py.bin 文件,向Python表明这是一个包 . 我在examples目录中也有一个 __init__.py.bin .

我不知道为什么Python在 sys.path 时找不到该文件 . 有任何想法吗?可以是权限问题吗?我需要一些执行权限吗?

21 回答

  • 2

    根据您对orip帖子的评论,我猜这就是发生的事情:

    • 您在Windows上编辑了 __init__.py .

    • windows编辑器添加了一些非打印的东西,也许是回车(Windows中的行尾是CR / LF;在unix中它只是LF),或者也许是CTRL-Z(windows end-of-file) .

    • 您使用WinSCP将文件复制到unix框中 .

    • WinSCP想:"This has something that's not basic text; I'll put a .bin extension to indicate binary data."

    • 缺少 __init__.py (现在称为 __init__.py.bin )意味着python不能将工具包理解为包 .

    • 您在相应的目录中创建 __init__.py ,一切正常......?

  • 1

    是否

    (local directory)/site-packages/toolkit
    

    有一个 __init__.py

    要使导入遍历目录,每个目录必须具有 __init__.py 文件 .

  • 6

    在* nix上,还要确保正确配置了PYTHONPATH,尤其是它具有以下格式:

    .:/usr/local/lib/python
    

    (注意开头的 .: ,这样它也可以搜索当前目录 . )

    它也可能在其他位置,具体取决于版本:

    .:/usr/lib/python
     .:/usr/lib/python2.6
     .:/usr/lib/python2.7 and etc.
    
  • 218

    当我在LPTHW做这个练习时,我碰到了一些非常相似的东西;我永远无法让Python认识到我在调用的目录中有文件 . 但我最终能够让它发挥作用 . 我做了什么,我推荐的是试试这个:

    (注意:从你的初始帖子开始,我假设你使用的是基于* NIX的机器,并且正在从命令行运行,所以这个建议是专门针对那些 . 因为我运行Ubuntu,这就是我所做的)

    1)将目录(cd)更改为文件所在目录上方的目录 . 在这种情况下,您尝试运行 mountain.py 文件,并尝试调用 toolkit.interface.py 模块,这些模块位于不同的目录中 . 在这种情况下,您将转到包含这两个文件的路径的目录(或者换句话说,这两个文件的路径共享的最近目录) . 在这种情况下, toolkit 目录 .

    2)当您在 tookit 目录中时,在命令行中输入以下代码行:

    export PYTHONPATH=.

    这会将您的PYTHONPATH设置为".",这基本上意味着您的PYTHONPATH现在将查找您当前所在目录中的任何被调用文件(以及更多,直到您所在目录的子目录分支 . 所以它不只是查看当前目录,而是查看 in 当前目录的所有目录 .

    3)在上面的步骤中设置PYTHONPATH后,从当前目录( toolkit 目录)运行模块 . Python现在应该找到并加载您指定的模块 .

    希望这可以帮助 . 我自己也很沮丧 .

  • 0

    我解决了自己的问题,我将写出错误和解决方案的摘要:

    该文件需要完全调用 __init__.py . 如果扩展名不同,例如我的情况 .py.bin ,则Python无法移动目录,然后无法找到模块 . 要编辑文件,您需要使用Linux编辑器,例如vinano . 如果您使用Windows编辑器,这将写入一些隐藏的字符 .

    影响它的另一个问题是我在root上安装了另一个Python版本,所以如果有人正在使用python的本地安装,请确保运行程序的Python安装是本地Python . 要检查这一点,只需执行 which python ,然后查看可执行文件是否是本地目录中的可执行文件 . 如果没有,请更改路径,但要确保本地Python目录比其他Python更早 .

  • 0

    要将目录标记为包,您需要一个名为 __init__.py 的文件,这有帮助吗?

  • 4

    一个简单的解决方案是使用 python -m pip install <library-name> 而不是 pip install <library-name> 来安装模块你可以在管理员限制的情况下使用sudo

  • 1

    使用 PyCharm (JetBrains套件的一部分),您需要将脚本目录定义为Source:
    Right Click > Mark Directory as > Sources Root

  • 0

    对 . 您需要该目录包含 __init__.py 文件,该文件是初始化程序包的文件 . 在这里,看看this .

    需要__init__.py文件才能使Python将目录视为包含包;这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块 . 在里面最简单的情况,__ init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量,稍后描述 .

  • 57
    • 您必须将文件__ init__.py放在要导入的文件所在的同一目录中 .

    • 您无法尝试导入具有相同名称的文件,并且是PYTHONPATH上配置的2个文件夹中的文件 .

    例如:/ etc / environment

    PYTHONPATH = $ PYTHONPATH中:/ opt /资料夹中:/ opt /文件夹2

    /选择/文件夹1 /富

    /选择/文件夹2 /富

    而且,如果你试图导入foo文件,python将不知道你想要哪一个 .

    来自foo import ... >>> importerror:没有名为foo的模块

  • 9

    Linux:导入的模块位于/usr/local/lib/python2.7/dist-packages中

    如果你're using a module compiled in C, don'忘记在 sudo setup.py install 之后chmod .so文件 .

    sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
    
  • 6

    在我的情况下,问题是我链接到调试 pythonboost::Python ,这要求扩展名为 FooLib_d.pyd ,而不仅仅是 FooLib.pyd ;重命名文件或更新 CMakeLists.txt 属性修复了错误 .

  • 28

    我的两分钱:

    enter image description here

    吐:

    Traceback (most recent call last):
          File "bash\bash.py", line 454, in main
            import bosh
          File "Wrye Bash Launcher.pyw", line 63, in load_module
            mod = imp.load_source(fullname,filename+ext,fp)
          File "bash\bosh.py", line 69, in <module>
            from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
        ImportError: No module named RecordGroups
    

    这让我感到很困惑 - 通过帖子和帖子暗示丑陋的syspath黑客(因为你看到我的 __init__.py 都在那里) . 事实证明,游戏/ oblivion.py和游戏/遗忘令人困惑的python吐出了相当无益的"No module named RecordGroups" . 我对一个解决方法和/或记录此(同名)行为的链接感兴趣 - >编辑(2017.01.24) - 看看What If I Have a Module and a Package With The Same Name?有趣的是,通常包装优先,但显然我们的 Launcher 违反了这一点 .

    编辑(2015.01.17):我没有提到我们使用custom launcher解剖here .

  • 2

    我的问题是我将带有 __init__.py 文件的目录添加到PYTHONPATH,实际上我需要添加其父目录 .

  • 13

    通过编写 print (sys.path) 解决了我的问题,并发现尽管安装干净,python仍在使用过时的软件包 . 删除这些make python会自动使用正确的包 .

  • 11

    如果你已经尝试了上面提供的所有方法但是失败了,那么你的模块可能有 the same name 作为内置模块 . 或者, the same name 存在于文件夹中的模块,该文件夹在 sys.path 中具有高于模块的优先级 .

    要调试,请说 from foo.bar import baz 投诉 ImportError: No module named bar . 更改为 import foo; print foo ,将显示 foo 的路径 . 这是你期望的吗?

    如果没有,请重命名 foo 或使用absolute imports .

  • 0

    在遇到同样的问题之后,我发现我的解决方案是从我的项目中删除所有 pyc 文件,似乎这些缓存的文件以某种方式导致此错误 .

    我发现这样做的最简单方法是导航到Windows资源管理器中的项目文件夹并搜索 *.pyc ,然后选择全部(Ctrl A)并删除它们(Ctrl X) .

    我可以通过删除特定的 pyc 文件解决我的问题,但我从未尝试过

  • 37

    我遇到了同样的问题: Import error . 此外,该库已100%正确安装 . 问题的根源是我的PC上安装了3版python(anaconda数据包) . 这就是图书馆没有安装到正确位置的原因 . 之后我在我的IDE PyCharm中更改为正确版本的python .

  • 22

    我有同样的错误 . 这是因为有人在我的脚本所在的文件夹中创建了一个文件夹,其名称与我从其他地方导入的模块冲突 . 它没有导入外部模块,而是查看了这个显然不包含预期模块的文件夹 .

  • 3

    我有同样的问题(Python 2.7 Linux),我找到了解决方案,我想分享它 . 在我的情况下,我有以下结构:

    Booklet
    -> __init__.py
    -> Booklet.py
    -> Question.py
    default
    -> __init_.py
    -> main.py
    

    在'main.py'中,我尝试过以下所有组合都失败:

    from Booklet import Question
    from Question import Question
    from Booklet.Question import Question
    from Booklet.Question import *
    import Booklet.Question
    # and many othet various combinations ...
    

    解决方案比我想象的要简单得多 . 我将文件夹“Booklet”重命名为“booklet”,就是这样 . 现在Python可以通过在'main.py'中使用代码来正常导入类问题:

    from booklet.Booklet import Booklet
    from booklet.Question import Question
    from booklet.Question import AnotherClass
    

    由此可以得出结论,像'booklet'这样的Package-Names(文件夹)必须从小写开始,否则Python会将它与类名和文件名混淆 .

    显然,这不是你的问题,但John Fouhy的回答非常好,这个帖子几乎可以引起这个问题 . 所以,这还有一件事,我希望也许这可以帮助别人 .

  • 0

    在我的情况下,我包括package.egg文件夹的路径,而不是下面的实际包 . 我将包复制到顶层并且有效 .

相关问题