【发布时间】:2010-09-08 03:03:27
【问题描述】:
我想从我的 c++ 程序中调用 python 脚本文件。
我不确定我将分发给的人是否会安装 python。
基本上,我正在寻找一个我可以使用的 .lib 文件,它具有类似 Apache 的分发许可证。
【问题讨论】:
标签: c++ python embedded-language
我想从我的 c++ 程序中调用 python 脚本文件。
我不确定我将分发给的人是否会安装 python。
基本上,我正在寻找一个我可以使用的 .lib 文件,它具有类似 Apache 的分发许可证。
【问题讨论】:
标签: c++ python embedded-language
我想从我的 c++ 程序中调用 python 脚本文件。
这意味着您希望将 Python 嵌入到您的 C++ 应用程序中。正如Embedding Python in Another Application中提到的:
嵌入 Python 类似于 扩展它,但不完全。这 不同的是,当你扩展 Python,主程序 应用程序仍然是 Python 解释器,而如果你嵌入 Python,主程序可能有 与 Python 无关——相反, 应用程序的某些部分 偶尔调用 Python 解释器来运行一些 Python 代码。
我建议你先通过Embedding Python in Another Application。然后参考下面的例子
如果你喜欢Boost.Python,可以访问以下链接:
【讨论】:
Boost 有一个 python 接口库可以帮助你。
有趣的是,还没有人提到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
}
【讨论】:
使用系统调用从 C++ 运行 python 脚本
#include<iostream>
#include <cstdlib>
using namespace std;
int main ()
{
int result = system("/usr/bin/python3 testGen1.py 1");
cout << result;
}
【讨论】:
在您的 C++ 应用程序中嵌入 Python 解释器将使您能够使用您的应用程序运行 Python 脚本来运行 Python 程序。它还将使这些脚本更容易在您的应用程序中调用 C++ 函数。如果这是您想要的,那么前面提到的 Boost 库可能就是您想要更轻松地创建链接的工具。过去我使用SWIG 来生成C++ 代码的Python 接口。从您的问题中不清楚您是希望 Python 脚本调用您的 C++ 程序还是只是希望 C++ 调用 Python。
许多 Python 函数使用 Python 解释器中未内置的模块。如果您的 Python 脚本调用这些函数,那么您将需要让您的用户安装 Python 或在您的应用程序中包含 Python 运行时文件。这将取决于您在 Python 脚本中导入的模块。
【讨论】:
Boost 可能是最好的选择,但是如果您想要更独立的东西,并且如果这是用于 Windows(这似乎是可行的,因为他们是最不可能安装 Python 的人),那么您可以使用py2exe 创建一个带有适合COM 对象的入口点的DLL。然后,您可以通过 COM 与库进行交互。 (显然,这作为跨平台解决方案一点用处都没有)。
【讨论】:
通过套接字使用进程间通信 (IPC) 可能是一种解决方案。使用本地网络套接字在两者之间侦听/传输命令。
【讨论】: