You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

遇到两个导入错误:

  1. 相对导入报错:ImportError: attempted relative import with no known parent package
  2. 绝对导入报错:ImportError: cannot import name 'models' from 'odoo' (unknown location)

解决方案一:遵循Odoo测试框架规范(推荐)

Odoo的测试脚本需要依托Odoo的运行环境,直接运行单个脚本会导致路径和环境初始化问题,正确做法如下:

  1. 将tests目录转为Python包
    在tests目录下创建空的__init__.py文件,让Python识别该目录为包结构的一部分。

  2. 编写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)
  1. 用Odoo命令运行测试
    在项目根目录(15.0/)下执行以下命令,Odoo会自动加载模块并运行测试:
./odoo-bin -c /path/to/your/odoo.conf -i Invoice_Integration --test-enable --stop-after-init

解决方案二:手动调整Python路径(临时调试用)

如果需要单独运行脚本调试,可以通过添加Python路径解决导入问题:

  1. 修改脚本开头,添加项目根目录到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
  1. 修复相对导入的写法
    如果坚持用相对导入,除了添加__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:45:29