gpt4 book ai didi

Python 找不到我的模块

转载 作者:IT老高 更新时间:2023-10-28 22:15:55 27 4
gpt4 key购买 nike

我有一个 python 项目(我在 virtualenv 中运行),它具有以下结构:

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

脚本.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作为 src 模块的一部分执行 script.py 的参数,如下所示:

$ 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 找不到我的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33862963/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com