从c ++程序调用python进行分发

时间:2008-09-08 03:53:40

标签: c++ python embedded-language

我想从我的c ++程序中调用python脚本文件。

我不确定我要分发的人是否会安装python。

基本上我正在寻找一个我可以使用的.lib文件,它具有类似Apache的分发许可证。

6 个答案:

答案 0 :(得分:63)

  

我想从我的c ++程序中调用python脚本文件。

这意味着您希望在您的C ++应用程序中嵌入Python。如Embedding Python in Another Application中所述:

  

嵌入Python类似于   扩展它,但不完全。该   不同的是,当你延长   Python,主要程序   应用程序仍然是Python   翻译,如果你嵌入   Python,主程序可能有   与Python无关 - 相反,   应用程序的某些部分   偶尔会调用Python   解释器运行一些Python代码。

我建议你先通过Embedding Python in Another Application。然后参考以下示例

  1. Embedding Python in C/C++: Part I

  2. Embedding Python in C/C++: Part II

  3. Embedding Python in Multi-Threaded C/C++ Applications

  4. 如果您喜欢Boost.Python,可以访问以下链接:

    1. Embedding Python with Boost.Python Part 1

答案 1 :(得分:29)

Boost有一个python接口库,可以帮助你。

Boost.Python

答案 2 :(得分:3)

在C ++应用程序中嵌入Python解释器将允许您使用应用程序运行Python脚本运行Python程序。它还使这些脚本更容易在您的应用程序中调用C ++函数。如果这是你想要的,那么前面提到的Boost库可能就是你想要更容易创建链接。在过去,我使用SWIG生成C ++代码的Python接口。从您的问题中不清楚您是否希望Python脚本调用您的C ++程序,或者您是否只是想让C ++调用Python。

许多Python函数都使用未内置于Python解释器中的模块。如果您的Python脚本调用这些函数,那么您需要让您的用户安装Python或在您的应用程序中包含python运行时文件。它取决于您在Python脚本中导入的模块。

答案 3 :(得分:2)

Boost可能是最好的选择,但是如果你想要一些更独立的东西,并且如果这是用于Windows(这似乎是可行的,因为他们是最不可能安装Python的人),那么你可以使用py2exe创建一个DLL,其入口点适合COM对象。然后,您可以通过COM与库进行交互。 (显然,这对于跨平台解决方案来说根本不是很有用)。

答案 4 :(得分:2)

有趣的是,还没有人提到pybind11。从他们的文档中:

  pybind11是一个轻量级的仅包含头文件的库,它公开了C ++类型   反之亦然,主要是创建现有的Python绑定   C ++代码。它的目标和语法类似于优秀   David Abrahams的Boost.Python库:最小化样板代码   在传统扩展模块中,通过使用   编译时自省。 [...]自创建以来,该库   在很多方面都超越了Boost.Python,   在许多常见情况下,绑定代码更简单。

具体来说,调用Python函数(称为嵌入)就这么简单(取自documentation):

#include <pybind11/embed.h> // everything needed for embedding
namespace py = pybind11;

int main() {
    py::scoped_interpreter guard{}; // start the interpreter and keep it alive
    py::print("Hello, World!"); // use the Python API
}

答案 5 :(得分:1)

使用系统调用从C ++运行python脚本

#include<iostream>
#include <cstdlib>
using namespace std;
int main ()
{
int result = system("/usr/bin/python3 testGen1.py 1");
cout << result; 
}