C++ with Python embedding: crash if Python not installed

后端 未结 4 968
猫巷女王i
猫巷女王i 2020-11-29 19:18

I\'m developing on Windows, and I\'ve searched everywhere without finding anyone talking about this kind of thing.

I made a C++ app on my desktop that embedded Pytho

相关标签:
4条回答
  • 2020-11-29 19:58

    Nice. And if you do not want to zip, copy Python26\DLLs & Python26\lib to your exe directory as:

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

    And then set PYTHONHOME with Py_SetPythonHome() API. Apparently, this API is not in the list of "allowed" calls before Py_Initialize();

    Below worked for me on Windows (Python not installed):

    #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;
    }
    

    Good that the search path is relative w.r.t the exe. Py_GetPath can show you where all it is looking for the modules.

    0 讨论(0)
  • 2020-11-29 20:02

    A zip of the Python standard library worked for me with Python27.

    I zipped the contents of Lib and dll, and made sure there was no additional python27-subfolder or Lib or dll subfolder. i.e. just a zip named python27.zip containing all the files.

    I copied that zip and the python27.dll alongside the executable.

    0 讨论(0)
  • 2020-11-29 20:07

    In addition to pythonxy.dll, you also need the entire Python library, i.e. the contents of the lib folder, plus the extension modules, i.e. the contents of the DLLs folder. Without the standard library, Python won't even start, since it tries to find os.py (in 3.x; string.py in 2.x). On startup, it imports a number of modules, in particular site.py.

    There are various locations where it searches for the standard library; in your cases, it eventually finds it in the registry. Before, uses the executable name (as set through Py_SetProgramName) trying to find the landmark; it also checks for a file python31.zip which should be a zipped copy of the standard library. It also checks for a environment variable PYTHONHOME.

    You are free to strip the library from stuff that you don't need; there are various tools that compute dependencies statically (modulefinder in particular).

    If you want to minimize the number of files, you can

    1. link all extension modules statically into your pythonxy.dll, or even link pythonxy.dll statically into your application
    2. use the freeze tool; this will allow linking the byte code of the standard library into your pythonxy.dll.
    3. (alternatively to 2.) use pythonxy.zip for the standard library.
    0 讨论(0)
  • 2020-11-29 20:18

    I wanted to add some additional info for others who might still be having troubles with this, as I was. I was eventually able to get my application working using the method proposed by user sambha, that is:

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

    ...with one important addition: I also needed to install the MSVCR90.DLL. I'm using Python 2.7 and apparently python27.dll requires the MSVCR90.DLL (and maybe other MSVC*90.DLLs).

    I solved this by downloading, installing, and running the 'vcredist_x86.exe' package from http://www.microsoft.com/en-us/download/details.aspx?id=29 . I think, though I am not certain, that you need to do it this way at least on Win7, as opposed to simply placing the MSVC*90.DLLs alongside your .exe as you may have done in the past. The Microsoft installer places the files and registers them in a special way under Win7.

    I also tried the .zip file method but that did not work, even with the MSVCR90.DLL installed.

    0 讨论(0)
提交回复
热议问题