No se puede integrar Python para trabajar con la biblioteca zip’d

Estoy intentando incrustar python, y proporcionar el dll y un zip de las bibliotecas de python y no usar ningún python instalado. Es decir, si un usuario no tiene python, quiero que mi código funcione utilizando la dll / zip proporcionada.

Esta publicación parece describir el proceso, excepto que no me funciona.

Si ejecuto lo siguiente, mi código se ejecutará siempre que tenga Python27.dll y una carpeta llamada Python27 que contenga las carpetas DLL y Lib.

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

Si elimino la carpeta de Python27, el código falla, por lo que estoy extrayendo la copia local, no cualquier python instalado.

Sin embargo, si comprimo la carpeta Python27 local, el código deja de ejecutarse y aparece “ImportError: No hay módulo llamado sitio”.

PEP273 hace que parezca que esto debería funcionar, pero todo lo que he intentado ha fallado.

¿Alguien puede aclarar cómo hacer que Python incrustado se ejecute desde un archivo zip?

Dado que hay preguntas relacionadas que han quedado sin respuesta, creo que sería útil si las personas agregaran un comentario si hubieran logrado leer correctamente un archivo zip, incluso si no están seguros de lo que podría necesitar corregir.

¡Al menos eso me ayudaría a entender si debo seguir buscando una respuesta!

Actualización : No importa lo que intente (incluso con LoadLibrary como se sugiere), puedo ejecutar mi progtwig desde un directorio completamente descomprimido. Cada vez que elimino el directorio con DLL / * y Lib / * y puse Python27.zip en su lugar, solo obtengo

 ImportError: No module named site 

Tuve dos problemas

El ‘Py_NoSiteFlag’ no bien documentado corrigió el

 ImportError: No module named site 

primer problema A continuación, tuve que actualizar las rutas. Al final, terminé con lo siguiente para la inicialización:

 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']"); 

[Editar para abordar la pregunta en los comentarios] Una vez que haya cargado el archivo comprimido, todavía debe pasar los archivos al motor de Python. Esto es lo que uso (no se incluyen los controles ni los controles de existencia de archivos).

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

[/editar]

Creo que su problema original es que colocó las carpetas en su zip de python, cuando debería colocar el contenido de las carpetas DLL y Lib en el zip de python.

En lugar de esto:

 python27.zip DLLs *.* Lib *.* 

Deberías:

 python27.zip *.* from DLLs *.* from Lib 

Tenga en cuenta que Windows primero busca bibliotecas en la ruta del ejecutable y solo entonces comienza a buscar en otros lugares. Si su python27.dll siempre se coloca en la ruta del ejecutable y usa LoadLibrary (“python27.dll”) o se vincula directamente a la biblioteca, siempre use la versión de python local. Si la carpeta \ python27 está vacía, su intérprete falla. Si la dll no está allí, utiliza el intérprete global.

Mueva la dll a una carpeta separada para que Windows solo la cargue si LoadLibrary lo solicita (“\ p27 \ python27.dll”)

Bueno, me gustaría publicar otro enlace aquí en caso de que alguien más encuentre un problema similar. Tengo que decir que, debido a la mala suerte, descargué Python 3.3.4, que tiene un error al usar la biblioteca comprimida, consulte http://bugs.python.org/issue20852