Unable to get python embedded to work with zip'd library
Question: 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 work using the provided dll/zip.

This [post](http://stackoverflow.com/questions/1387906/c-with-python-
embedding-crash-if-python-not-installed) seems to describe the process, except
it isn't working for me.

If I run the following, my code will run as long as I have Python27.dll and a
_folder_ named Python27 that contains the DLL and Lib folders.

    
    
    Py_SetProgramName(argv[0]);  /* optional but recommended */
    Py_SetPythonHome("Python27");
    Py_Initialize();
    

If I remove the Python27 folder, the code fails - so I am pulling in the local
copy, not any installed python.

However, if I zip the local Python27 folder, the code stops running, giving
"ImportError: No module named site".

[PEP273](http://www.python.org/dev/peps/pep-0273/) makes it sound like this
should just work, but everything I've tried has failed.

Can anyone shed light on how to get embedded python to run from a zip file?

Given that there are related questions that have gone unanswered, I think it
would be helpful if people would add a comment if they have successfully
gotten reading from a zip file working, even if they aren't sure what I might
need to fix.

That would at least help me understand if I should keep looking for an answer!

**Update** : No matter what I try (even with LoadLibrary as suggested), I can
run my program from a fully unzipped directory. Any time I remove the
directory with DLLs/* and Lib/* and put in Python27.zip instead, I just get

    
    
    ImportError: No module named site
    


Answer: 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]

