当前位置: 首页 > 面试题库 >

Python找不到我的模块

赏开宇
2023-03-14
问题内容

我有一个python项目(我在virtualenv中运行),其结构如下:

Project
├───.git
├───venv
└───src
    ├───__init__.py
    ├───mymodules
    │   ├───__init__.py
    │   ├───module1.py
    │   └───module2.py
    └───scripts
        ├───__init__.py
        └───script.py

script.py

import src.mymodules.module1
...

我使用以下命令从venv激活运行项目,并从Project目录中运行该项目:

(venv)$ python src/scripts/script.py

该脚本会运行,但是在退出之前会发出以下错误:

Traceback (most recent call last):
  File "src/scripts/script.py", line 1, in <module>
    import src.mymodules.module1
ImportError: No module named src.mymodules.module1

我试过运行python shell并尝试从那里导入模块,但没有出错。我在src的每个目录中都有_ _init__.py。python是否将工作目录视为src
/ scripts?为什么会发生这种情况?如果是这种情况,如何使src成为工作目录?


问题答案:

本质上,当您script.py直接执行时,它不知道它是的子模块的一部分src,也不知道命名的模块src可能在哪里。在python
2或3中就是这种情况。

如您所知,Python根据的内容查找模块sys.path。为了导入任何模块,它必须位于中列出的目录中sys.path,或者与您正在运行的脚本位于同一目录中。

当您说时python src/scripts/script.py,请sys.path包含Project/src/scripts/(因为script.py位于此处),但不包含Project。由于Project不在路径中,因此src无法导入该目录()中的模块。

要解决此问题:

我假设您script.pysrc模块的入口点(例如,也许是主程序)。如果是这样,那么您可以script.py向上移动至与以下级别相同的级别来进行修复src

Project
├───.git
├───venv
|───script.py       <--- script.py moves up here
└───src
    ├───__init__.py
    └───mymodules
        ├───__init__.py
        ├───module1.py
        └───module2.py

这样,script.py就可以自由地导入任何内容src,但是insrc中什么也不能导入script.py

如果不是这种情况,并且script.py确实是的一部分src,则可以使用python的-m参数script.py作为src模块的一部分执行,如下所示:

$ python -m src.scripts.script

因为您已经告诉python您正在运行哪个模块(src),所以它将位于路径中。因此,请script.py注意,它是的子模块src,然后可以从导入src

在这种情况下,虽然小心-有可能创造一个圆形的进口,如果事情在src进口src.scripts.script

作为这两种方法的替代,您可以sys.path直接在中修改script.py

import sys
sys.path.insert(0, '/path/to/Project') # location of src

尽管此方法有效,但通常不是我的偏好。它需要script.py确切地知道代码的布局方式,并且如果另一个python程序尝试导入,可能会导致导入混乱script.py



 类似资料:
  • 问题内容: 我是Python的初学者。在开始之前,这是我的Python文件夹结构 在下面,我有一个名为的文件夹,其中有一个Python文件,其内容如下: 接下来,我位于文件夹中,位于上一级: 每当我运行它都会导致错误 我有什么想念的吗? 问题答案: Python中的所有模块都必须具有特定的目录结构。您可以在此处找到详细信息。 在目录下创建一个空文件,使您的目录结构如下所示: 同样在文件中,将imp

  • 问题内容: 我最近在计算机上安装了cx_Oracle模块,以连接到远程Oracle数据库服务器。(我身边没有Oracle客户端)。 Python:2.7 x86版 Oracle:版本11.1.X x64 Cx_Oracle:版本5.1.2-11g.win32-py2.7 然后,每次我运行脚本时,脚本都会失败并显示以下消息: ImportError:DLL加载失败:找不到指定的模块。 我想知道是否我

  • 问题内容: 我是EAR的新手。我已经开发了一个功能相互依赖的Web模块和ejb模块。为此,我试图将它们配置在EAR中。我将web和ejb模块都映射到EAR,可以看到application.xml为 但是当我尝试执行EAR时,我的服务器抛出以下异常 从上面我可以理解,EAR无法定位EJB模块中存在的类,因此引发异常。我正在使用WildFLy 10服务器和Eclipse IDE。 问题答案: EAR文

  • 但是当我尝试执行EAR时,我的服务器抛出异常 从上面我可以理解的是,EAR无法定位EJB模块中存在的类,因此抛出异常。我使用的是Wildfly10服务器和eclipse IDE。

  • 已安装Python 3.7.6并尝试在Visual Studio Code中编写代码 使用: 获取ModuleNotFoundError的错误:没有名为“pikepdf”的模块 但是,我运行“pip install pikepdf”,得到: 已满足要求:c:\users\ME\appdata\local\packages\pythonsoftwarefoundation中的pikepdf。蟒蛇3.

  • 问题内容: 大家好,我只是在学习烧瓶。我用pip来安装它。然后,当我运行此基本代码时,我得到一个错误。基本上,我看到它的工作,然后突然退出,并出现以下错误。这可能看起来是一些环境问题,但我不确定。前几天这很奇怪,现在却行不通。 问题答案: 您说过,仅当您从交互式shell运行代码时,才会出现此问题。它是由(wsgi服务器所基于的)功能引起的。 如果更改了项目文件,则在调试模式下将自动重新启动服务器