Python相对导入报错:无法识别父包,Odoo项目模块导入求助
解决方案:Odoo 15自定义模块测试脚本导入问题
问题背景
需要在send_ticari_satis_invoice.py中导入以下内容:
bifatura_methods.py中的send_invoice函数xml_generator.py中的start函数inputs.py中的data_json_1、data_json_2字典
当前工作目录:
/home/selman/PycharmProjects/15.0/custom_addons/Invoice_Integration/models/tests
遇到两个导入错误:
- 相对导入报错:
ImportError: attempted relative import with no known parent package - 绝对导入报错:
ImportError: cannot import name 'models' from 'odoo' (unknown location)
解决方案一:遵循Odoo测试框架规范(推荐)
Odoo的测试脚本需要依托Odoo的运行环境,直接运行单个脚本会导致路径和环境初始化问题,正确做法如下:
将tests目录转为Python包
在tests目录下创建空的__init__.py文件,让Python识别该目录为包结构的一部分。编写Odoo风格的测试类
修改send_ticari_satis_invoice.py内容,继承Odoo的测试基类,Odoo会自动处理模块导入路径:
from odoo.tests.common import TransactionCase class TestSendTicariSatisInvoice(TransactionCase): def test_invoice_process(self): # 在测试方法内导入所需模块 from ..bifatura_methods import send_invoice from ..xml_generator import start from .inputs import data_json_1, data_json_2 # 编写你的测试逻辑 send_invoice(...) start(...) print(data_json_1)
- 用Odoo命令运行测试
在项目根目录(15.0/)下执行以下命令,Odoo会自动加载模块并运行测试:
./odoo-bin -c /path/to/your/odoo.conf -i Invoice_Integration --test-enable --stop-after-init
解决方案二:手动调整Python路径(临时调试用)
如果需要单独运行脚本调试,可以通过添加Python路径解决导入问题:
- 修改脚本开头,添加项目根目录到Python路径
import sys from pathlib import Path # 获取项目根目录(15.0/,即custom_addons的上级目录) project_root = Path(__file__).resolve().parents[3] sys.path.append(str(project_root)) # 现在可以使用绝对导入 from custom_addons.Invoice_Integration.models.bifatura_methods import send_invoice from custom_addons.Invoice_Integration.models.xml_generator import start from custom_addons.Invoice_Integration.models.tests.inputs import data_json_1, data_json_2
- 修复相对导入的写法
如果坚持用相对导入,除了添加__init__.py,还要确保从项目根目录运行脚本:
# 相对导入需要tests目录是包,且运行时Python的工作目录是项目根 from ..bifatura_methods import send_invoice from ..xml_generator import start from .inputs import data_json_1, data_json_2 # 同目录模块需要加.
然后在15.0/目录下运行:
python -m custom_addons.Invoice_Integration.models.tests.send_ticari_satis_invoice
错误原因说明
- 相对导入失败:直接运行脚本时,Python不会将当前脚本的父目录识别为包结构的一部分,必须将脚本作为包的模块运行,或手动设置路径。
- Odoo导入错误:直接运行脚本未初始化Odoo环境,Odoo的
models模块需要在Odoo启动流程中加载,单独运行脚本无法触发该加载逻辑。
内容的提问来源于stack exchange,提问作者Selman
相关产品推荐
相关产品推荐

