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

brqmpdu1  于 2023-08-02  发布在  Python
关注(0)|答案(3)|浏览(125)

我有一个项目的以下目录:

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_utilslight_profilesphoto_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文件,所以我不认为这是问题所在。我已经尝试使用SET PYTHONPATH="C:\Users\Josh\Documents\PhotoAnalyzer\photo_analysis"photo_analysis模块添加到Python路径中,还尝试使用sys.path技术。两者都以与之前相同的错误消息结束。
photo_utils.py从“gui”模块导入widgets.py。我会不会是循环依赖?我确实尝试了text中解释的解决方法,将widgets导入到photo_utils中使用它的每个方法中,虽然这允许photo_utils中的测试主代码正常运行,但app.py仍然给出相同的错误消息,即没有名为“photo_analysis”的模块。
我错过了什么?

42fyovps

42fyovps1#

导航到photo_analyzer/目录并运行

python3 -m gui.app

字符串

tpxzln5u

tpxzln5u2#

我认为你需要使用相对导入。
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包。
这个guide很好地解释了相对导入是如何工作的。

sf6xfgos

sf6xfgos3#

这是一个棘手的问题。通常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

相关问题