将Python嵌入C++;

将Python嵌入C++;,python,c++,python-embedding,Python,C++,Python Embedding,如果这个问题可以用更好的措辞/需要分成许多问题,请提醒我 我需要打包Python脚本,以便将它们作为单个可执行文件(理想情况下)或带有支持文件的单个可执行文件(非理想情况下)发布 我见过py2app和py2exe。它们不符合我的要求,因为我正在寻找一种方法来实现这一点,将来可能需要让打包的脚本与运行它们的可执行文件进行交互 最好的办法是什么?我将要嵌入的脚本甚至可能需要多个文件,我确信这会使事情复杂化 如果我想在将来使用一个除了CPython(即PyPy或StAccess)的解释器,那么这个过程

如果这个问题可以用更好的措辞/需要分成许多问题,请提醒我

我需要打包Python脚本,以便将它们作为单个可执行文件(理想情况下)或带有支持文件的单个可执行文件(非理想情况下)发布

我见过py2app和py2exe。它们不符合我的要求,因为我正在寻找一种方法来实现这一点,将来可能需要让打包的脚本与运行它们的可执行文件进行交互

最好的办法是什么?我将要嵌入的脚本甚至可能需要多个文件,我确信这会使事情复杂化

如果我想在将来使用一个除了CPython(即PyPy或StAccess)的解释器,那么这个过程会不同吗(除了C++可执行文件中的API调用)? Python必须安装在运行包的计算机上,还是嵌入Python意味着它完全嵌入?我在pythonwiki上看到了一些关于

Py_SetPythonHome()
,这向我表明它需要安装Python(或者至少是它的库)。我说的对吗?

使用
--onefile
选项会将所有内容放在一个文件中,尽管启动需要更多的时间。恐怕它与PyPy不兼容,但使用Stackless让它工作起来应该不会太棘手


祝你好运

您确定需要嵌入Python文件吗

我这样问是因为您提到要将Python文件打包为单个可执行文件。你不能在目标机器上安装Python吗?因为Python脚本本身就是可执行的,你只需要一些东西就可以启动它们。主python脚本可以启动所有其他脚本

<>否则你应该用C++来运行Python脚本。然后让主python脚本运行所有其他脚本。

可以! 最简单的方法是使用最新的Python3

#包括
int
main(int argc,char*argv[])
{
wchar_t*program=Py_DecodeLocale(argv[0],NULL);
if(程序==NULL){
fprintf(stderr,“致命错误:无法解码argv[0]\n”);
出口(1);
}
Py_SetProgramName(program);/*可选,但推荐*/
Py_初始化();
PyRun_SimpleString(“从导入时间开始,ctime\n”
“打印('Today is',ctime(time()))\n”);
Py_Finalize();
PyMem_RawFree(项目);
返回0;
}

更复杂的部分是C++代码和Python代码之间的通信。 如果您只需要来回传递几个字符串,这很简单,但是如果您想要非常紧密的集成,那么您可能需要以下几个:

  • 在(C++代码,C ABI)中创建一个Python模块并注入它——这意味着Python将能够运行
    import yourmod;YouMo.YouFunc(…)<代码> >它将运行C++自定义代码<强>和/或 
  • 从C++(逆)
  • 解析和调用Python函数
单个可执行文件 如果你没有安装程序,并且真的不希望有一堆.DLL/.so/etc(如这里所述),并且它是特定于ABI的,那么Windows、Linux等将有一种方法,你可能必须重写Python的导入机制(这样它就不会在文件系统中查找DLL/so)——此时,您也可以在应用程序中使用PyInstaller或扩展/合并PyInstaller。请研究并评估这可能有多困难

皮皮 简单嵌入是可能的,但单文件嵌入不是。您可以破解PyPy源代码并构建定制的可嵌入对象,但您将是第一个这样做的人:)

无堆栈
应该像常规的cpython一样简单

有几种方法可以嵌入Python。这应该是一个很好的“艰难之路”(如果你想深入交流,你可能需要这样做):这就是我开始研究的地方。我从那开始就很满意,但是我不确定如何将我的脚本和它们的依赖项保存在一个可执行文件中。我需要嵌入脚本,因为我希望程序能够像安装一样易于卸载。我希望避免在目标计算机上安装Python,这样当用户不想再使用我的程序时,他们可以将其拖到垃圾箱中,它将消失无踪。您可以让安装程序同时安装和卸载Python,以便安装程序执行以下操作:1)安装Python 2)运行脚本3)卸载Python。当然,你必须知道如何使用InstallAnywhere或类似的安装程序。哇,这看起来令人印象深刻!谢谢你的提示!
#include <Python.h>

int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }
    Py_SetProgramName(program);  /* optional but recommended */
    Py_Initialize();
    PyRun_SimpleString("from time import time,ctime\n"
                       "print('Today is', ctime(time()))\n");
    Py_Finalize();
    PyMem_RawFree(program);
    return 0;
}