带有外部 Python 库的 Odoo 自定义模块

Odoo custom module with external Python library

我使用 Python 库 ujson 在 Python 中创建了一个 Odoo 模块。 我使用 pip install ujson.

在我的开发服务器上手动安装了这个库

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

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

有什么关于如何配置我的模块的建议吗?或者我应该只在我的模块中包含库的目录?

以下是在 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 文件中,这样就可以了。

您应该尝试导入除外以处理 odoo 服务器启动时的问题:

try:
    from external_dependency import ClassA
except ImportError:
    pass

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

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

非常感谢 Ivan 和他的 Blog

感谢@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'])

在python文件中使用下面的命令,你可以安装它(它只适用于odoo)。例如:这里我要安装xlsxwriter

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