python - 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”。我也愿意用不会产生问题的项目结构来改变项目结构。
解决方案
如果您想通过它们的根名称来引用所有这些包,那么您所要做的就是将该文件夹添加到 Python 路径中。因此,对于 src 中的主程序脚本,只需添加如下内容:
import os
import sys
sys.path.append( os.path.abspath(os.path.dirname(__file__)+'/..') )
现在,无论您从何处运行脚本,您的脚本的父目录都将位于该路径上。现在你可以说
from src.resources.parser import read_yaml
推荐阅读
- javascript - Three.js 的交互式鼠标效果
- r - 如何将多行合并为单列的单行?
- javascript - Promise 和异步代码:如何在 Promise.all 中抛出 500 状态码
- python - Python AST:类型错误重写节点
- android - LiveData 有两个来源?
- php - PHP 致命错误:不能使用“对象”作为类名(CakePHP)
- python - 网络抓取错误消息:“int”对象没有属性“get”
- python - 如何在 Pygame 中创建自动化对象
- linux - 可以将 perl 模块从一台 Linux 机器复制到另一台机器吗?
- angular - Angular 4中具有自动完成功能和一些验证控制的文本区域