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

Edu*_*rdo 414 python python-import importerror

Python安装在本地目录中.

我的目录树如下所示:

(local directory)/site-packages/toolkit/interface.py
Run Code Online (Sandbox Code Playgroud)

我的代码在这里:

(local directory)/site-packages/toolkit/examples/mountain.py
Run Code Online (Sandbox Code Playgroud)

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

from toolkit.interface import interface
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

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

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

Joh*_*uhy 249

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

  1. __init__.py在Windows上编辑过.
  2. Windows编辑器添加了一些非打印,可能是回车(Windows中的行尾是CR/LF;在unix中它只是LF),或者可能是CTRL-Z(windows文件结束).
  3. 您使用WinSCP将文件复制到您的unix框.
  4. WinSCP认为:"这有些东西不是基本文本;我会用.bin扩展名表示二进制数据."
  5. 缺少__init__.py(现在称为__init__.py.bin)意味着python不能将工具包理解为包.
  6. __init__.py在适当的目录中创建,一切正常......?

  • 另外,python -c'import sys; print sys.path'帮助 - 有时用户已将文件放在未扫描的路径中. (38认同)
  • 如果我有一个空的"\ _ _ _ init\_\_ _.py"会发生同样的事吗? (8认同)
  • 对我来说,问题是我使用了 `python driver.py`,而我应该使用 `python3 driver.py`,因为我安装了 `pip3`。 (3认同)
  • 我正在使用相同的东西,除了 WinSCP 没有附加`.bin`。 (2认同)
  • 天哪,你统治!这是我的故事:1.您在Windows 2上编辑了__init__.py.它添加了一个TAB而不是空格3.在您找到这篇文章之前,您会谷歌很多!;) (2认同)

igo*_*gue 66

是否

(local directory)/site-packages/toolkit
Run Code Online (Sandbox Code Playgroud)

有一个__init__.py

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

  • 这不是只有相对路径引用才需要吗?为什么**必须**每个目录都有它? (5认同)

小智 42

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

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

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

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

export PYTHONPATH=.

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

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

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

  • 或在Windows上,设置PYTHONPATH =。 (2认同)

Ren*_*aud 41

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

 .:/usr/local/lib/python
Run Code Online (Sandbox Code Playgroud)

(请注意.:开头,以便它也可以搜索当前目录.)

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

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
Run Code Online (Sandbox Code Playgroud)

  • 它也可能是`.:/ usr/lib/python`,`.:/ usr/lib/python2.6`,`.:/ usr/lib/python2.7`等等,具体取决于版本 (6认同)
  • 在MacOSX上,可以通过在启动脚本中添加PYTHONPATH = / usr / local / lib / python2.7 / site-packages进行修复。 (2认同)

Edu*_*rdo 23

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

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

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


ori*_*rip 16

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


Bad*_*laj 16

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

  • `python -m` 在 `pip install` 前面实现了什么? (4认同)
  • @sporc - 当您使用 -m 命令行标志时,Python 将为您导入一个模块或包,然后将其作为脚本运行。当您不使用 -m 标志时,您命名的文件将作为脚本运行。 (2认同)

Mon*_*ded 14

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


miy*_*iya 7

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

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


liu*_*obe 7

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

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

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


avp*_*avp 7

您正在阅读此答案,表明您__init__.py来对地方了,您已经安装了所有依赖项,并且仍在获取ImportError

我遇到了类似的问题,除了我的程序在使用PyCharm运行时可以正常运行,但是当我从终端运行它时出现了上述错误。进一步挖掘之后,我发现PYTHONPATH该项目目录中没有该条目。因此,我将PYTHONPATH每个Import语句设置为在PyCharm上有效,但不能在terminal上使用

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)
Run Code Online (Sandbox Code Playgroud)

使用sys.pathas 的另一种方法是:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')
Run Code Online (Sandbox Code Playgroud)

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

  • 这很棒。如果您确定自己处于正确的路径中,则应用它的一般方法是:``sys.path.append(os.getcwd())``` (3认同)
  • 这就是我作为解决方法所做的。但我仍然不明白为什么这是必要的。在我的 Pipfile 中,如果没有上述解决方法,则无法检测到相对路径模块(例如,我收到 ImportError)。 (2认同)

AKJ*_*AKJ 7

对于所有仍然有这个问题的人。我相信 Pycharm 会与进口混淆。对我来说,当我写 'from namespace import something' 时,前一行用红色下划线标出,表示有错误,但有效。然而,''from .namespace import something' 没有下划线,但也不起作用。

尝试

try:
    from namespace import something 
except NameError:
    from .namespace import something
Run Code Online (Sandbox Code Playgroud)

  • 第一个是 python 2 语法,第二个是 python 3。 (3认同)

Ias*_*mes 6

  1. 您必须将文件__ init__.py放在要导入的文件所在的同一目录中.
  2. 您不能尝试导入具有相同名称的文件,并且是PYTHONPATH上配置的2个文件夹中的文件.

例如:/ etc/environment

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

/选择/文件夹1 /富

/选择/文件夹2 /富

并且,如果您尝试导入foo文件,python将不知道您想要哪一个.

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


kev*_*kev 6

对我来说,那真是愚蠢。我使用来安装该库,pip3 install但正在运行程序python program.py而不是python3 program.py。有时候就是那样¯\_(?)_/¯


jua*_*osl 6

对我来说,将文件作为模块运行有帮助。

代替

python myapp/app.py
Run Code Online (Sandbox Code Playgroud)

使用

python -m myapp.app
Run Code Online (Sandbox Code Playgroud)

它并不完全相同,但在某些情况下可能是更好的方法。


Mr_*_*s_D 5

我的两分钱:

在此处输入图片说明

吐:

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
Run Code Online (Sandbox Code Playgroud)

这让我很困惑-遍历各种帖子,暗示了丑陋的syspath hacks(如您所见,我__init__.py在那里)。好吧,事实证明game / oblivion.py和game / oblivion混淆了python,并吐出了相当无用的“没有名为RecordGroups的模块”。我对解决此问题和/或记录此(相同名称)行为的链接感兴趣->编辑(2017.01.24)-看看如果我具有相同名称的模块和软件包怎么办?有趣的是,通常程序包具有优先权,但显然我们的启动器违反了这一点。

编辑(2015.01.17):我没有提到我们使用此处剖析的自定义启动器