Python无法找到我的模块

我有一个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激活项目目录运行项目:

(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.py是你的src模块的入口点(例如,也许它是主程序).如果这是真的,那么你可以通过将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中自由导入任何内容,但src中没有任何内容可以导入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,则可能会创建循环导入.

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

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

虽然这有效,但通常不是我的偏好.它需要script.py确切地知道你的代码是如何布局的,如果另一个python程序试图导入script.py,可能会导致导入混乱.

转载注明原文:Python无法找到我的模块 - 代码日志