首页 > 解决方案 > Python 中的绝对/相对导入:ModuleNotFoundError 等

问题描述

这是我的项目结构:

- config
- data
- src
    - resources 
    - db
- test

注意:我使用的是 Python 3.9,每个包含 .py 文件的文件夹也有一个__init__.py文件

我要运行的所有脚本都位于 /src 文件夹中,它们使用来自 /src/resources 文件夹中的其他脚本的代码(基本上就像一个库)。其中一些脚本还从 /config 文件夹中读取 YAML 文件

这是问题所在,我找不到从命令行正确运行这些脚本的方法,我总是收到如下错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/runpy.py", line 185, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/usr/local/lib/python3.8/runpy.py", line 111, in _get_module_details
    __import__(pkg_name)
  File "/home/pi/crypto/src/ethMessage.py", line 4, in <module>
    import update_db
  File "/home/pi/crypto/src/update_db.py", line 1, in <module>
    from db.mysql_main import insertValueAndFee
  File "/home/pi/crypto/src/db/mysql_main.py", line 6, in <module>
    from src.resources.parser import read_yaml
ModuleNotFoundError: No module named 'src'

我尝试了相对导入和绝对导入,现在我正在使用绝对导入(例如 from src.resources.parser import read_yaml)

从命令行运行脚本的正确方法是什么?

编辑:

正如你所建议的,我添加了

sys.path.append( os.path.abspath(os.path.dirname(__file__)+'/..') )

到所有主要脚本,我仍然收到类似的错误:

Traceback (most recent call last):
  File "src/ethMessage.py", line 6, in <module>
    import update_db
  File "/home/pi/crypto/src/update_db.py", line 1, in <module>
    from db.mysql_main import insertValueAndFee
  File "/home/pi/crypto/src/db/mysql_main.py", line 6, in <module>
    from src.resources.parser import read_yaml
ModuleNotFoundError: No module named 'src'

为了澄清,我从全局文件夹运行我的脚本,在我的例子中,它被命名为“crypto”。我也愿意用不会产生问题的项目结构来改变项目结构。

标签: pythonpython-importimporterrorproject-structure

解决方案


如果您想通过它们的根名称来引用所有这些包,那么您所要做的就是将该文件夹添加到 Python 路径中。因此,对于 src 中的主程序脚本,只需添加如下内容:

import os
import sys
sys.path.append( os.path.abspath(os.path.dirname(__file__)+'/..') )

现在,无论您从何处运行脚本,您的脚本的父目录都将位于该路径上。现在你可以说

from src.resources.parser import read_yaml

推荐阅读