Python错误 "ImportError: No module named"

621

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。此外,工具包文件夹中有文件__init__.py.bin来告诉Python这是一个包。我还在示例目录中有一个__init__.py.bin

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


4
确保你在Python中有该文件的读取权限。 参考链接:https://dev59.com/E2Qm5IYBdhLWcg3w6ShR#20999950 - cSn
2
请务必将您的目录标记为“资源根目录”,以便PyCharm知道这是一个包。 - Yushan ZHANG
在我的情况下,问题是新安装的模块的权限不是“755”。这是因为机器上的“umask”是“0027”,导致“其他人”没有“读取”权限,导致模块无法读取。添加“读取”权限解决了我的问题。建议在安装后检查目标目录的权限。 - anu
尝试访问以下网址: https://stackoverflow.com/questions/47887614/how-to-import-module-or-a-file-from-subfolder-in-python/47887660#47887660 - Rawan-25
我该如何将我的目录标记为“资源根目录”?https://stackoverflow.com/users/6829195/yushan-zhang - skittlebiz
显示剩余4条评论
38个回答

3

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


2
如果你正在使用设置脚本/工具(例如setuptools)来部署你的软件包,请不要忘记将相应的文件/模块添加到安装程序中。
当支持时,使用 find_packages() 或类似方法自动将新包添加到安装脚本中。这绝对能够避免许多麻烦,尤其是当你暂时放下项目一段时间后再添加新内容时。
import setuptools

setuptools.setup(
    name="example-pkg",
    version="0.0.1",
    author="Example Author",
    author_email="author@example.com",
    description="A small example package",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

(示例来自setuptools文档

1

如果你时间很紧,而其他方法都失败了:

import sys
import os
wd = '/path/to/current/script/'
sys.path.append(wd)
os.chdir(wd)
print(os.getcwd())
print(sys.path)

1

我曾经遇到过同样的问题(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”中使用以下代码正常导入Question类:
from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

从这个可以得出结论,像“booklet”这样的包名(文件夹)必须以小写字母开头,否则Python会将其与类名和文件名混淆。
显然,这不是你的问题,但John Fouhy的答案非常好,而且这个线程几乎涵盖了可能导致此问题的任何内容。所以,这是另一件事情,我希望这也可以帮助其他人。

1

另一个原因导致了这个问题

file.py

#!/bin/python
from bs4 import BeautifulSoup
  • 如果你的默认 pythonpython2
$ file $(which python)
/sbin/python: symbolic link to python2
  • file.py需要使用python3,对于这种情况(bs4
  • 您不能像这样使用python2执行此模块:
$ python file.py
# or
$ file.py
# or
$ file.py # if locate in $PATH

两种解决此错误的方法:
# should be to make python3 as default by symlink
$ rm $(which python) && ln -s $(which python3) /usr/bin/python
# or use alias
alias python='/usr/bin.../python3'

或者在 file.py 文件中更改 shebang

#!/usr/bin/...python3

1
我发现更改别名文件夹(Mac)的名称(通过GUI)可能会导致加载模块时出现问题。 如果更改了原始文件夹名称,请重新创建符号链接。 我不确定这种行为有多普遍,但调试起来很令人沮丧。

1
在我的情况下,我使用sys.path.insert() 导入本地模块时,从不同的库中得到了 module not found 的错误。我必须把sys.path.insert()放在报告module not found的导入语句下面。我猜最好的做法是将sys.path.insert()放在你的导入语句的底部。

1
在Linux服务器上尝试使用命令dos2unix script_name(如果有的话)删除所有pyc文件,使用命令find . -name '*.pyc' -delete,然后重新运行脚本,以防您在Windows上编写了脚本。

0
在Ubuntu的apt-get安装程序中,通常将包的Python3版本命名为。
python3-XYZ

还有Python2版本

python-XYZ

通常情况下,尝试使用错误消息中提到的包的python3-XYZpython-XYZ。不需要猜测,可以通过正则表达式在apt缓存中搜索。然后:
$ apt-cache search "python.*toolkit.*interface"
python3-cli-helpers - easy command-line apps with Python
python3-exam - Python module to help write better tests
python3-fltk - Python wrapper for the Fast Light Toolkit
python3-mpltoolkits.basemap - matplotlib toolkit to plot on map projections (Python 3)
python3-nltk - Python3 libraries for natural language processing
python3-onnx - Open Neural Network Exchange (ONNX) (Python)
python3-paraview - Parallel Visualization Application. python-support
python3-pyswarms - research toolkit for particle swarm optimization in Python
python3-wxgtk-media4.0 - Python 3 interface to the wxWidgets Cross-platform C++ GUI toolkit (wx.media)
python3-wxgtk-webview4.0 - Python 3 interface to the wxWidgets Cross-platform C++ GUI toolkit (wx.html2)
python3-wxgtk4.0 - Python 3 interface to the wxWidgets Cross-platform C++ GUI toolkit
python3-xapian - Xapian search engine interface for Python3
wxglade - GUI designer written in Python with wxPython

它找不到它。

请注意,这个apt-get技巧有时也需要用于依赖包,或者更换使用方式。

我在使用Python2.7的Flask包时也遇到了同样的错误信息,但当我尝试以下操作后,它就消失了:

sudo apt-get install python-flask

因此,请尝试:

sudo apt-get install python-[YOURPYTHONVERION]-[YOURERRORPACKAGE]

或者检查所提到的依赖项。


0
我遇到了同样的问题:导入错误。此外,库已经被100%正确地安装了。问题的根源是在我的电脑上安装了3个版本的Python(Anaconda包)。这就是为什么库没有被正确安装的原因。之后我只需在我的IDE PyCharm中更改到正确的Python版本即可。

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