如何导入同一目录或子目录中的模块?

问题描述 投票:0回答:3

我的项目有以下目录:

photo_analyzer/
│
├── main.py                # Main script to run the photo analyzer
├── gui/                   # Directory for GUI-related files
│   ├── __init__.py        # Package initialization
│   ├── app.py             # Tkinter application class and main GUI logic
│   ├── widgets.py         # Custom Tkinter widgets (if needed)
│   ├── styles.py          # Styling configurations for the GUI
│   └── resources/         # Directory for GUI resources (e.g., icons, images)
│       ├── icon.png       # Application icon
│       └── ...
│
├── photo_analysis/        # Directory for photo analysis-related files
│   ├── __init__.py        # Package initialization
│   ├── photo_utils.py     # Utility functions for photo manipulation
│   ├── light_profiles.py  # Functions to analyze light profiles in photos
│   └── ...

我正在尝试将

photo_utils
light_profiles
photo_analysis
模块导入到
gui/app.py
。每当我尝试运行
app.py
时,我都会收到以下错误消息:

Traceback (most recent call last):
  File "c:\Users\Josh\Documents\PhotoAnalyzer\gui\app.py", line 6, in <module>
    from photo_analysis import photo_utils
ModuleNotFoundError: No module named 'photo_analysis'

我在两个目录中都有空的

__init__.py
文件,所以我认为这不是问题。我尝试使用
photo_analysis
SET PYTHONPATH="C:\Users\Josh\Documents\PhotoAnalyzer\photo_analysis"
模块添加到 Python 路径,并且我也尝试使用
sys.path
技术。两者都以与之前相同的错误消息结束。

photo_utils.py
从“gui”模块导入
widgets.py
。我可能遇到循环依赖吗?我确实尝试了 text 中解释的解决方法,将
widgets
导入到
photo_utils
中使用它的每个方法中,虽然这允许
photo_utils
中的测试主代码正常运行,但
app.py
仍然给出同样的错误消息,没有名为“photo_analysis”的模块。

我错过了什么?

python module importerror
3个回答
0
投票

导航到

photo_analyzer/
目录并运行

python3 -m gui.app

0
投票

这是一个棘手的问题。通常,Python 会从其同级文件或同级文件夹的子级导入。 在这里,如果您想从来自同一父级的文件导入,则必须使用

sys.path.append('.')

其次还取决于终端当前的工作目录。如果您当前的工作目录是“photo_analyzer”,那么添加这些行就可以了

import sys
sys.path.append('.')
import photo_analysis.photo_utils as pa

否则,如果您当前的工作目录是“photo_analyzer/gui”,那么您必须添加这些行

import sys
sys.path.append('./../photo_analysis')
import photo_utils as pa

0
投票

我认为你需要使用相对导入。

gui/app.py
中,您可以使用相对导入从
photo_analysis
包中导入模块。

# gui/app.py

# Use relative import to import photo_utils from photo_analysis package
from ..photo_analysis import photo_utils

# Use relative import to import light_profiles from photo_analysis package
from ..photo_analysis import light_profiles

import 语句中的 .. 表示在目录层次结构中上升一级,然后您可以访问 photo_analysis 包内的模块。

此外,请确保您正在运行

main.py
或根目录 (
photo_analyzer/
) 中导入
gui.app
或其他模块的另一个脚本。如果直接运行
app.py
,可能找不到
photo_analysis
包。

这个指南很好地解释了相对导入的工作原理。

© www.soinside.com 2019 - 2024. All rights reserved.