Unable to get python embedded to work with zip'd library

前端 未结 4 1827
一向
一向 2021-02-09 10:19

I\'m trying to embed python, and provide the dll and a zip of the python libraries and not use any installed python. That is, if a user doesn\'t have python, I want my code to

相关标签:
4条回答
  • 2021-02-09 11:04

    I had two issues.

    The not well documented 'Py_NoSiteFlag' fixed the

    ImportError: No module named site
    

    first problem. Next, I had to update paths. In the end, I ended up with the following for initialization:

    Py_NoSiteFlag=1;
    Py_SetProgramName(argv[0]);
    Py_SetPythonHome(".");
    Py_InitializeEx(0);
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path = ['.','python27.zip','python27.zip/DLLs','python27.zip/Lib','python27.zip/site-packages']");
    

    [edit to address question in comments] Once you have the zip'd file loading, you still need to pass files to the python engine. Here's what I use (argument and file existence checks not included).

    PyObject* PyFileObject = PyFile_FromString(argv[1], "r");
    int res = PyRun_SimpleFile(PyFile_AsFile(PyFileObject), argv[1]);
    

    [/edit]

    0 讨论(0)
  • 2021-02-09 11:06

    Well, I'd like to post another link here in case someone else encounter similar issue. I have to say that due to bad luck, I happened to download the python 3.3.4, which has a bug when using zipped library, see http://bugs.python.org/issue20852

    0 讨论(0)
  • 2021-02-09 11:13

    I believe your original problem is that you placed the folders in your python zip, when you should place the contents of the DLLs and Lib folders into the python zip.

    Instead of this:

    python27.zip
      DLLs
        *.*
      Lib
        *.*
    

    You should have:

    python27.zip
      *.* from DLLs
      *.* from Lib
    
    0 讨论(0)
  • 2021-02-09 11:21

    Note that windows searches for libraries in the executable's path first and only then starts looking in other places. If your python27.dll is always placed in the executable's path and you use LoadLibrary("python27.dll") or bind to the library directly, you just always use the local python version. If the \python27-folder is empty then, your interpreter fails. If the dll is not there, you use the global interpreter.

    Move the dll into a separate folder so windows will only load it if asked for it by LoadLibrary("\p27\python27.dll")

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