C ++和Python嵌入:崩溃,如果没有安装的Python(C++ with Python emb

2019-07-05 07:35发布

我开发在Windows上,我已经找遍没有发现任何人谈论这种事情。

我做了嵌入式Python 3.1使用MSVC我的桌面上的一个C ++应用程序。 我挂python31.lib并包含在旁边的可执行应用程序的运行文件夹python31.dll。 它的伟大工程。 我的延伸和嵌入代码,绝对可行,有没有崩溃。

我送在脚本安装阶段运行文件夹,我的朋友没有安装Python的谁,并为他的应用程序崩溃。

几个小时前,我试图在已安装的Python 2.6我的笔记本电脑的应用程序。 我得到了相同的碰撞行为是我的朋友,并通过调试发现,这是Py_Initialize()调用失败。

我在我的笔记本电脑安装了Python 3.1在不改变应用程序代码。 我跑了它,它运行完美。 我卸载的Python 3.1和应用程序再次崩溃。 我把代码在我的应用程序动态地从本地python31.dll链接,以确保它是使用它,但我仍然得到崩溃。

我不知道如果解释需要比DLL更启动或什么。 我一直没能找到关于此的任何资源。 Python文档和其他导游似乎并不永远解决如何分配使用Python嵌入你的C / C ++应用程序,而无需用户安装Python本地。 我知道它比在Unix Windows上的问题,但我已经看到了那把Python本地Windows的C / C ++应用程序,我不知道他们是如何做到这一点。

做些什么,我需要以外的DLL? 为什么当我安装Python,然后停止工作,当我卸载它,它的工作? 这听起来像它应该是那么微不足道; 也许这就是为什么没有人真正谈论它。 不过,我真的不能解释如何处理这个问题坠毁。

预先感谢您非常多。

Answer 1:

除了pythonxy.dll,还需要整个Python库,即lib文件夹中的内容,再加上扩展模块,即动态链接库文件夹的内容。 如果没有标准库,Python将不会开始,因为它试图找到os.py(在3.X;在2.X string.py)。 在启动时,它导入多个模块,特别是site.py.

在有些情况下它会搜索标准库的各个位置; 在你的情况下,最终发现它在注册表中。 之前,使用可执行文件名(如通过Py_SetProgramName设置)试图找到具有里程碑意义的; 它也检查它应该是标准库的压缩副本的文件python31.zip。 它还检查一个环境变量PYTHONHOME。

你可以自由地剥去东西,你不需要库; 有一些计算依赖静态(特别是modulefinder)的各种工具。

如果你希望尽量减少文件的数量,你可以

  1. 静态链接所有的扩展模块到您的pythonxy.dll,甚至是静态链接pythonxy.dll到你的应用
  2. 使用冻结工具; 这将允许标准库的字节码链接到您的pythonxy.dll。
  3. (可替换地为2)使用pythonxy.zip为标准库。


Answer 2:

尼斯。 如果你不想拉链,Python26 \的DLL和Python26 \ lib中复制到您的exe文件目录:

.\myexe.exe       
.\python26.dll
.\Python26\DLLs
.\Python26\lib

然后设置与Py_SetPythonHome()API PYTHONHOME。 显然,这个API是不是在“允许”呼叫列表之前 Py_Initialize();

下面为我工作在Windows(未安装了 Python):

#include "stdafx.h"
#include <iostream>
#include "Python.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
   char pySearchPath[] = "Python26";
   Py_SetPythonHome(pySearchPath);
   Py_Initialize();
   PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
   //cerr << Py_GetPath() << endl;
   Py_Finalize();

    return 0;
}

良好的搜索路径是相对WRT exe文件。 Py_GetPath可以告诉你,所有正在查找模块。



Answer 3:

我想添加一些额外的信息为他人谁可能仍然有这个烦恼,因为我是。 我最终能得到我的应用程序中使用由用户sambha提出的方法的工作,那就是:

Program Files (x86)\
    MyApplicationFolder\
        MyApplication.exe
        python27.dll
        Python27\
            DLLs\ (contents of DLLs folder)
            Lib\ (contents of Lib folder)

...一个重要的补充:我还需要安装MSVCR90.DLL。 我使用Python 2.7,显然python27.dll需要MSVCR90.DLL(也许其他MSVC * 90.DLLs)。

我通过下载,安装和运行了“选择vcredist_x64.exe”包解决了这个http://www.microsoft.com/en-us/download/details.aspx?id=29 。 我想,虽然我不能肯定,你需要做这种方式至少在Win7的,而不是简单地把MSVC * 90.DLLs旁边您的.exe,你可能在过去所做的那样。 微软安装程序会将文件,并在Win7下的一种特殊的方式注册它们。

我也尝试了.zip文件的方法,但没有工作,即使在安装了MSVCR90.DLL。



Answer 4:

Python标准库的拉链工作对我来说与Python27。

我拉上库和dll 的内容 ,并确保没有额外的python27,子文件夹或库或DLL子文件夹。 即只需一个zip命名包含的所有文件python27.zip。

我复制的拉链和python27.dll旁边的可执行文件。



文章来源: C++ with Python embedding: crash if Python not installed