模块未找到 - 没有名为的模块

109

这是我Python的文件夹结构

-project
----src
------model
--------order.py
------hello-world.py

src 下有一个名为 model 的文件夹,其中包含一个名为 order.py 的 Python 文件,其内容如下:

class SellOrder(object):
    def __init__(self,genericName,brandName):
        self.genericName = genericName
        self.brandName = brandName

接下来,我的hello-world.py文件位于src文件夹内,比order.py文件所在的目录层级高一级:

import model.order.SellOrder

order = SellOrder("Test","Test")

print order.brandName

每当我运行python hello-world.py时,都会出现错误。
Traceback (most recent call last):
  File "hello-world.py", line 1, in <module>
    import model.order.SellOrder
ImportError: No module named model.order.SellOrder

我有没有漏掉什么?


init.py文件应该包含什么内容? - user962206
https://docs.python.org/2/tutorial/modules.html#packages - Padraic Cunningham
2
__init__.py 可以为空,也可以包含代码。项目通常会在包级别公开其主要/公共类。在您的情况下,您可以添加 from model.order import SellOrder,这样其他代码就可以使用 from project import Sellorder 而不是 from project.model.order import SellOrder - miraculixx
17个回答

75

Python中的所有模块必须具有特定的目录结构。您可以在此处找到详细信息。

model目录下创建一个名为__init__.py的空文件,这样您的目录结构将类似于:

.
└── project
    └── src
        ├── hello-world.py
        └── model
            ├── __init__.py
            └── order.py

同时在您的hello-world.py文件中将导入语句更改为以下内容:

from model.order import SellOrder

那应该修复它了

附注:如果您将model目录放置在其他位置(不在同一目录分支中),则必须使用sys.path修改Python路径。


18
最好的做法是不要有一个 src 目录。这也很有道理,因为如果你在别的地方引用你的代码,你应该能够使用 import project.model 而不是 project.src.model - miraculixx
非常晚才来到这个帖子,但我有与上面完全相同的结构,并且使用上面的解决方案,我仍然只能在使用from src.module.submodule import main时运行我的程序(locust -f src\main.py ...)。即使有__init__.py也是如此。也许我的cwd应该在src内部? - Guy
2
这似乎不起作用。 我在每个文件夹中都有 __init__.py,但仍无法导入。 Pycharm没有显示任何错误,但终端一直显示错误。 - Dekriel
由于某种原因,当我运行Python文件时它可以工作。但是当在交互模式下执行相同的命令时,它却无法工作。非常有趣。 - Eduardo Reis
是的,对我来说添加__init__.py并不能解决这个问题。即使在同一个目录下(即两个脚本都在同一个文件夹下)。 - wesmlr
@Dekriel @wesmir 如果项目按照模块中描述的方式设置,应该可以工作。然而,有很多原因可能导致您的特定情况无法正常运行。可以尝试一些简单的方法:(1)检查您的PYTHONPATH;(2)检查您的包是否在sys.path中;(3)确保您的导入正确(路径正确);(4)确保您的包名称与现有/已安装的包不冲突...没有实际错误信息,我很难推断出可能发生的情况。 - RafazZ

24

如果这是您的根模块,只需将其添加到PYTHONPATH中(PyCharm通常会这样做)

export PYTHONPATH=$PYTHONPATH:<root module path>

对于 Docker:

ENV PYTHONPATH="${PYTHONPATH}:<root module path in container>"

2
如果您将从根模块运行此代码,如果当前目录“.”尚未在PYTHONPATH中,则将其添加到PYTHONPATH非常方便。Linux:export PYTHONPATH=$PYTHONPATH:.。Windows:set PYTHONPATH=%PYTHONPATH%;. - Akaisteph7
非常感谢!! 根据传递到 docker-compose up 的参数,我在我的项目中调用不同的脚本,这是解决 Docker Compose 中导入正确的唯一方法,而不仅仅是在直接通过 Python 运行它时。 - LucianoBAF

10

在每个层次结构中,您需要一个名为__init__.py(两个下划线)的文件,因此在src/model/中都需要一个。这是Python用来确定是否应访问特定文件夹的方法。尽管这些文件旨在包含初始化指令,但即使将它们创建为空文件也可以解决问题。


1
src 目录下,不需要 init.py 文件,请参考 @Rafazz 的回答。 - Timo

4

如果您使用以下代码,则更容易

python3 -m module.sub_module

例如:
python3 -m entrypoint.settings

2

只需将您的项目根目录添加到环境变量PYTHONPATH中即可。因此,对于以下项目结构,只需将Rootdir路径(例如:添加E:\ Projects \ Rootdir)添加到PYTHONPATH中。

Rootdir
└── pkg2
    ├── b.py
    ├── c.py
     └── pkg2
      ├── b.py
      ├── c.py
    

1

我也遇到了同样的错误。对于在不同服务器上运行Python脚本的人,请检查shebang中是否正确指定了Python路径。在我的情况下,每个服务器上的Python路径都位于不同的目录中。


2
这就是为什么你永远不应该使用 #!/usr/bin/python,而是要使用 #!/usr/bin/env python(对于Python3,则是 #!/usr/bin/env python3,或者可能是特定版本的 #!/usr/bin/env python3.8)。这种方式在使用虚拟环境时也会有效,而第一种形式则不会。 - wovano

1
尝试使用以下代码添加路径:

pip show

在命令提示符中使用,且使用HTML标记


sys.path.insert(0, "/home/myname/pythonfiles")

安装失败。尝试使用conda代替pip重新安装模块时,出现了SSL错误。

我只是从路径中复制了未找到的模块,我的路径是

C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages 

所以我将它复制到'C:\Users\user\Anaconda3\Lib\site-packages'


1

我只将Python作为辅助语言使用,可能犯了初学者错误。我遇到类似的问题,我的错误是调用:

import requests

我遇到了错误

ModuleNotFoundError: No module named 'requests.adapters'; 'requests' is not a package

原来我在同一文件夹中创建的名为“requests.py”的文件造成了冲突。重命名该文件后问题得以解决。

0

你需要确保模块已安装在所有版本的python上

您可以通过运行以下命令来检查python是否安装了模块:

pip uninstall moduleName

如果已安装,它会询问您是否要删除它。我的问题是它已安装在python中,但未安装在python3中。要检查模块是否安装在python3中,请运行:

python3 -m pip uninstall moduleName

这样做后,如果发现模块未安装在其中一个或两个版本中,请使用以下两个命令安装模块。

  • pip install moduleName
  • python3 -m pip install moduleName


21
这不是问题所要求的。 - Roy
4
嗯,这对我有帮助。那些模块在PyCharm中可以工作,但是当我通过终端运行程序时,它显示了“ModuleNotFoundError”,而这个解决方案解决了我的问题。 - Verma Aman

0

另一种解决方案取决于您从何处运行此代码。

如果您尝试运行python hello-world.py(来自src目录),则需要执行以下两个操作才能使其正常工作:

  1. 将hello-world.py中的导入行更改为from model.order import SellOrder
  2. 如果还没有,请添加到系统环境变量。键PYTHONPATH,值.

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