python错误“ImportError: No module named”

Python error “ImportError: No module named”

python安装在本地目录中。

我的目录树如下:

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

我的代码在这里:

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

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

1
from toolkit.interface import interface

我得到了错误:

1
2
3
4
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中找不到文件。有什么想法吗?这会是权限问题吗?我需要执行许可吗?


根据你对ORIP帖子的评论,我想这就是发生的事情:

  • 您在Windows上编辑了__init__.py
  • Windows编辑器添加了一些非打印内容,可能是回车(Windows中的行尾是cr/lf;在UNIX中是lf),也可能是ctrl-z(Windows文件尾)。
  • 您使用winscp将文件复制到您的Unix设备。
  • winscp想:"这有一些不是基本文本的东西;我会放一个.bin扩展名来表示二进制数据。"
  • 缺少的__init__.py(现在称为__init__.py.bin)意味着python无法将工具箱理解为一个包。
  • 你在适当的目录中创建__init__.py,一切都能正常工作…?

  • 1
    (local directory)/site-packages/toolkit

    __init__.py吗?

    要使import遍历目录,每个目录都必须有一个__init__.py文件。


    在*nix上,还要确保pythonpath配置正确,特别是它具有以下格式:

    1
     .:/usr/local/lib/python

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

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

    1
    2
    3
     .:/usr/lib/python
     .:/usr/lib/python2.6
     .:/usr/lib/python2.7 and etc.


    在lpthw中做这个练习时,我遇到了非常类似的情况;我无法让python识别我在调用的目录中有文件。但最终我还是成功了。我所做的和我推荐的是尝试一下:

    (注意:从您最初的帖子中,我假设您使用的是基于*nix的机器,并且正在从命令行运行这些东西,所以这个建议是专门针对这一点的。自从我运行Ubuntu以来,我就是这样做的)

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

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

    export PYTHONPATH=.

    这将您的pythonpath设置为".",这基本上意味着您的pythonpath现在将在当前所在目录中查找任何被调用的文件,(更确切地说,是在您所在目录的子目录分支中)。因此,它不仅在当前目录中查找,而且在当前目录中的所有目录中查找)。

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

    希望这有帮助。我自己对此很失望。


    我解决了我自己的问题,我会写一个错误和解决方法的总结:

    该文件需要准确地命名为__init__.py。如果扩展名是不同的,比如在我的例子中是.py.bin,那么python就不能在目录中移动,也就找不到模块。要编辑文件,需要使用Linux编辑器,如vi或nano。如果使用Windows编辑器,这将写入一些隐藏字符。

    影响它的另一个问题是,根目录安装了另一个python版本,所以如果有人在本地安装python,请确保运行程序的python安装是本地python。要检查这一点,只需执行which python,并查看可执行文件是否在本地目录中。如果没有,请更改路径,但请确保本地python目录在其他python之前。


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


    一个简单的解决方案是使用python -m pip install 而不是pip install 安装模块。如果有管理限制,您可以使用sudo。


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


  • 您必须将文件in it_uuu.py保存在您要导入的文件所在的目录中。
  • 不能尝试从pythonpath上配置的2个文件夹中导入同名文件。
  • 如:/ETC/环境

    pythonpath=$pythonpath:/opt/folder1:/opt/folder2

    /选择/文件夹1/foo

    /选择/文件夹2/foo

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

    从foo导入…>>>导入错误:没有名为foo的模块


    是的。您需要目录包含__init__.py文件,该文件是初始化包的文件。这里,看看这个。

    The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__ variable, described later.


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

    如果您使用的是C语言编译的模块,请不要忘记在sudo setup.py install之后对.so文件进行chmod。

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

    我的两分钱:

    enter image description here

    唾液:

    1
    2
    3
    4
    5
    6
    7
    8
    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

    这把我搞糊涂了——浏览了一些帖子和帖子,上面提到了丑陋的系统路径黑客(如你所见,我的__init__.py)。原来game/oblivion.py和game/oblivion让python很困惑它指出了相当无用的"没有名为记录组的模块"。我会对记录这一(同名)行为的变通方法和/或链接感兴趣->编辑(2017.01.24)-看看如果我有一个模块和一个同名的包该怎么办?有趣的是,通常包优先,但显然我们的启动程序违反了这一点。

    编辑(2015.01.17):我没有提到我们使用了一个在这里解剖的自定义启动程序。


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


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


    你在阅读这个答案时说你的__init__.py在正确的位置,你已经安装了所有的依赖项,你仍然得到ImportError

    我遇到了一个类似的问题,除了我的程序在使用pycharm运行时可以正常运行,但是当我从终端运行它时,上面的错误是这样的。在进一步挖掘之后,我发现PYTHONPATH没有项目目录条目。因此,我将每份进口声明中的PYTHONPATH设置为pycharm,而不是从终端:

    1
    export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

    使用sys.path还有另一种方法可以做到这一点:

    1
    2
    3
    import sys
    sys.path.insert(0,'<project directory>') OR
    sys.path.append('<project directory>')

    可以根据要搜索项目的顺序使用插入/追加。


    如果您尝试了上面提供的所有方法,但失败了,那么您的模块可能与内置模块同名。或者,文件夹中存在与模块同名的模块,该文件夹在sys.path中的优先级高于模块的优先级。

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

    如果没有,请重命名foo或使用绝对导入。


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


    我也面临同样的问题:Import error。此外,库已100%正确安装。问题的根源是我的pc 3版本的python(Python包)已经安装。这就是为什么库被安装到正确的位置。在那之后,我在我的IDepycharm中改成了正确的Python版本。


    这对我很有用:在父文件夹中创建了__init__.py文件(在您的情况下,在site-packages文件夹中)。像这样导入:

    1
    from site-packages.toolkit.interface import interface

    希望对您也有帮助!


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


    我有同样的问题(python 2.7linux),我已经找到了解决方案,我想和大家分享一下。在我的案例中,我的结构如下:

    1
    2
    3
    4
    5
    6
    7
    Booklet
    -> __init__.py
    -> Booklet.py
    -> Question.py
    default
    -> __init_.py
    -> main.py

    在"main.py"中,我尝试了以下所有组合,但没有成功:

    1
    2
    3
    4
    5
    6
    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 ...

    解决方案比我想象的要简单得多。我把文件夹"小册子"改名为"小册子",就这样。现在,python可以通过在"main.py"中使用以下代码来正常导入类问题:

    1
    2
    3
    from booklet.Booklet import Booklet
    from booklet.Question import Question
    from booklet.Question import AnotherClass

    由此我可以得出结论,包名(文件夹)如"小册子"必须从小写开始,否则Python会将其与类名和文件名混淆。

    显然,这不是你的问题,但是约翰·福伊的回答很好,而且这条线几乎有任何可能引起这个问题的东西。所以,这是另外一件事,我希望这能帮助其他人。


    在我的例子中,我包含了package.egg文件夹的路径,而不是下面的实际包。我把这个包复制到了顶层,它工作了。


    在我的例子中,因为我正在使用pycharm和pycharm为项目文件夹中的每个项目创建一个"venv",但它只是python的一个迷你env。虽然您已经在python中安装了所需的库,但在自定义项目"venv"中,它不可用。这是"importError:Pycharm中没有名为xxxx的模块"的真正原因。要解决此问题,必须通过以下步骤将库添加到项目自定义环境中:

    • 在pycharm中,从菜单"文件"->设置
    • 在设置对话框中,项目:XXXProject->Project解释器
    • 单击"添加"按钮,将显示"可用程序包"对话框。
    • 搜索库,单击"安装软件包"
    • 然后,所有您需要的软件包将安装在您的项目自定义"venv"文件夹中。

    Settings dialog

    享受。


    在经历了同样的问题之后,我发现我的解决方案是从我的项目中删除所有pyc文件,似乎这些缓存的文件不知何故导致了这个错误。

    最简单的方法是在Windows资源管理器中导航到我的项目文件夹并搜索*.pyc,然后选择全部(ctrl+a),然后删除它们(ctrl+x)。

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