部署嵌入了python的C++程序

Posted

技术标签:

【中文标题】部署嵌入了python的C++程序【英文标题】:Deploying C++ program with python embedded 【发布时间】:2017-10-27 06:48:14 【问题描述】:

我有一个 Qt C++ 项目,对于某些功能,我添加了 Python。 C++函数调用python脚本并返回值。如下例所示。

PyObject *pName,*pModule,*pFunc;
PyObject *pArgs,*pValue;
const char *module="getBeamData";
pName=PyUnicode_FromString(module);
pModule=PyImport_Import(pName);
if(pModule!=NULL)
    pFunc=PyObject_GetAttrString(pModule,"getBeamDose");
    if(pFunc&&PyCallable_Check(pFunc))
        pArgs=PyTuple_New(2);        
  PyTuple_SetItem(pArgs,0,PyBytes_FromString(path.toStdString().c_str()));
        PyTuple_SetItem(pArgs,1,PyLong_FromLong(fraction));      
        pValue=PyObject_CallObject(pFunc,pArgs);

它调用脚本getBeamdata.py。功能工作正常。我是否必须为所有客户和发货脚本安装 python 和库(如 numpy)?或者有没有其他不发送脚本的方法。

【问题讨论】:

【参考方案1】:

如果不静态编译您的 Python 脚本,您将需要分发:

requirements.txt(适用于脚本所需的所有库/模块)。 脚本所需的正确 Python 版本(2.7/3 等)的详细信息。

或者,您可以考虑使用 py2exe 创建可执行文件并分发它,尽管您需要修改程序与 Python 脚本交互的方式。

有关分发 Python can be found here 的更多详细信息。

【讨论】:

【参考方案2】:

如果我是你,我会使用某种安装程序。

现在,在该安装程序中,您当然可以嵌入脚本的 wheel 版本,此外还将使用 setuptools 进行安装。

在 setuptools 脚本中,您可以提及依赖项,但这意味着您的客户应该在他/她的计算机上安装 Python,或者您应该发布您自己的嵌入软件的 Python 版本。

这样的功能也可以使用Boost.Python来实现

【讨论】:

以上是关于部署嵌入了python的C++程序的主要内容,如果未能解决你的问题,请参考以下文章

将 Python 嵌入到 C++ 应用程序中,无论是不是安装了 Python(在 Windows 上)

如果我想将 Python 嵌入到 C++ 程序中,我应该在我的程序文件夹中放啥?

在 c 中嵌入 Python,然后在不工作的 c++ 程序中运行它

在 C++ 中嵌入 python

如何中断嵌入在 C++ 应用程序中的 python 解释器

从 C++ 库中嵌入 Java 代码而不需要***程序来嵌入它?