【问题标题】:Calling python from a c++ program for distribution从 C++ 程序调用 python 进行分发
【发布时间】:2010-09-08 03:03:27
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ python embedded-language


【解决方案1】:

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

这意味着您希望将 Python 嵌入到您的 C++ 应用程序中。正如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

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

  1. Embedding Python with Boost.Python Part 1

【讨论】:

  • 这不适用于 2008 年以后的任何 Visual Studio 版本,因为这就是编译 windows 的 python 的内容。如果您找到或能够自己使用以后的运行时编译 python 版本,则可能是可能的。我刚刚花了一天时间尝试使用 vs 2013 编译 python,但没有任何成功。
  • 我能够使用 VS 2015 构建一个用于嵌入的库。这并不难,但弄清楚这些步骤是令人沮丧的。 stackoverflow.com/questions/48545255/…
  • “这意味着您希望将 Python 嵌入到您的 C++ 应用程序中......” - 不一定。他可能很想启动一个外部进程并等待该进程。
  • 最终链接断开
【解决方案2】:

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

Boost.Python

【解决方案3】:

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

pybind11 是一个轻量级的仅头文件库,它公开了 C++ 类型 在 Python 中,反之亦然,主要是创建现有的 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
}

【讨论】:

  • 哇,我很幸运能一直向下滚动到这个答案!
【解决方案4】:

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

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

【讨论】:

  • 在使用 python 的内置模块时它适用于我。但是,在 python 文件中导入模块(例如,numpy)时,它无法导入。知道如何解决这个问题吗?
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 为什么运行 Windows 的人更有可能安装 Python?
    • Ubuntu自带python 2默认安装,什么意思?
    【解决方案7】:

    通过套接字使用进程间通信 (IPC) 可能是一种解决方案。使用本地网络套接字在两者之间侦听/传输命令。

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 1970-01-01
      • 2015-09-21
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多