【问题标题】:Odoo custom module with external Python library带有外部 Python 库的 Odoo 自定义模块
【发布时间】:2017-03-07 08:41:42
【问题描述】:

我使用 Python 库 ujson 在 Python 中创建了一个 Odoo 模块。 我使用pip install ujson 在我的开发服务器上手动安装了这个库。

现在我想在我的实时服务器上安装模块。我可以以某种方式告诉 Odoo 模块在安装 ujson 库时安装它吗?所以我只需要将模块添加到我的插件路径并通过 Odoo Web 界面安装它?

让这个自动化的另一个原因是如果我想共享我的自定义模块,这样其他人就不必在他们的服务器上手动安装库。

对如何以这种方式配置我的模块有什么建议吗?还是应该只在我的模块中包含库的目录?

【问题讨论】:

    标签: python-2.7 openerp odoo-10


    【解决方案1】:

    你应该尝试-除了导入来处理 odoo 服务器启动问题:

    try:
        from external_dependency import ClassA
    except ImportError:
        pass
    

    对于您模块的其他用户,请在您的模块清单(v9 及更低版本:__openerp__.py;v10+:__manifest__.py)中扩展 external_dependencies,这将在安装时提示警告:

    "external_dependencies": {
        'python': ['external_dependency']
    },
    

    非常感谢 Ivan 和他的Blog

    【讨论】:

    • 感谢您的提示。在清单中包含外部依赖会产生更好的错误消息。但是,我最初希望自动安装依赖的 python 库。
    • 是的,我已经了解您的初始要求,但我没有更好的解决方案,而且我确信 Odoo 中没有开箱即用的解决方案。
    【解决方案2】:

    感谢@Walid Mashal 和@CZoellner 的帮助,你们都为我指明了正确的方向。

    我现在通过将以下代码添加到我的模块的 __init__.py 中解决了这个任务:

    import pip
    try:
        import ujson
    except ImportError:
        print('\n There was no such module named -ujson- installed')
        print('xxxxxxxxxxxxxxxx installing ujson xxxxxxxxxxxxxx')
        pip.main(['install', 'ujson'])
    

    【讨论】:

    • 别那样做,你加载的脚本不应该是安装东西。
    • 那么您建议的解决方案是什么? @Loïc Faure-Lacroix
    • 这是一个部署问题。处理需求的常用方法是将它们存储在存储库的 requirements.txt 文件中。例如,odoo.sh 将在启动 odoo 之前查找这些文件以安装依赖项。本质上,这样做总是会安装所有依赖项。我有一些脚本在工作,这些脚本也可以自省外部依赖项的清单。因此,始终首先安装所有依赖项,如果不能安装。部署无法更进一步,因此 odoo 始终处于良好状态。
    【解决方案3】:

    在 python 文件中使用以下命令,您可以安装它(它仅适用于 odoo)。 eg:这里我要安装xlsxwriter

    try:
        import xlsxwriter
    except:
        os.system("pip install xlsxwriter")
        import xlsxwriter
    

    【讨论】:

      【解决方案4】:

      以下是在report.py (odoo_root_folder/addons/report/models/report.py)内的基础插件中的odoo基础模块report中用于安装wkhtmltopdf的代码。

      from openerp.tools.misc import find_in_path
      import subprocess
      
      def _get_wkhtmltopdf_bin():
          return find_in_path('wkhtmltopdf')
      
      try:
          process = subprocess.Popen([_get_wkhtmltopdf_bin(), '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      except (OSError, IOError):
          _logger.info('You need Wkhtmltopdf to print a pdf version of the reports.')
      

      基本上,您需要找到一些 python 代码来运行库并安装它,并将该代码包含在其中一个 .py 文件中,这样就可以了。

      【讨论】:

      • 我不太清楚如何实现安装部分。我需要试试这个。谢谢你的帮助。如果我成功了,我会告诉你的。
      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      相关资源
      最近更新 更多