2010-03-22 9 views
9

Hola compañeros desarrolladores de software.¿Cómo crear una aplicación que incruste y ejecute el código de Python sin la instalación local de Python?

Quiero distribuir un programa en C que se pueda secuenciar incrustando el intérprete de Python.
El programa C usa Py_Initialize, PyImport_Import y así sucesivamente para lograr la incrustación de Python.

Busco una solución en la que sólo se distribuyo los siguientes componentes:

  • la biblioteca de Python

    • mi ejecutable del programa y sus bibliotecas (DLL/SO)
    • un archivo ZIP que contiene todos los módulos y bibliotecas de Python necesarios.

    ¿Cómo puedo lograr esto? ¿Hay una receta paso a paso para eso?

    La solución debe ser adecuada para Windows y Linux.

    Gracias de antemano.

  • +0

    Eliminé mi respuesta porque no era aplicable. Es posible que desee editar la pregunta para que quede claro que está incorporando Python en una aplicación C. – FogleBird

    +1

    Posiblemente relacionado: http://stackoverflow.com/questions/1387906/c-with-python-embedding-crash-if-python-not-installed –

    Respuesta

    1

    echó un vistazo a Portable Python? No es necesario instalar nada. Solo copie los archivos incluidos para usar el intérprete.

    Editar: Esta es una solución de Windows solamente.

    +0

    Portable Python también fue un hallazgo cuando hice mi investigación. Pero no es lo que estoy buscando. No debería haber otra dependencia. – Robert

    0

    ¿Ha mirado Embedding Python in Another Application en la documentación de Python?

    Una vez que tenga eso, puede usar un enlace de importación (vea PEP 302) para tener sus módulos de carga de código Python incrustados en el lugar que elija. Sin embargo, si tiene todo en un archivo zip, probablemente solo necesite convertirlo en la única entrada en sys.path.

    +0

    ¡Ah, debería haber refrescado los comentarios antes de publicar ...! –

    1

    Simplemente probé mi ejecutable en una computadora que no tiene Python instalado y funcionó.

    Cuando vincula Python a su ejecutable (no importa si dinámico o estáticamente) su ejecutable ya obtiene la funcionalidad básica de Python (operadores, métodos, estructuras básicas como cadena, lista, tupla, dict, etc.) SIN otra dependencia .

    Luego, dejo que Python's setup.py compile una distribución de fuente Python a través de python setup.py sdist --format=zip que me dio un archivo ZIP que llamé pylib-2.6.4.zip.

    Mis nuevas medidas fueron:

    char pycmd[1000]; // temporary buffer for forged Python script lines 
    ... 
    Py_NoSiteFlag=1; 
    Py_SetProgramName(argv[0]); 
    Py_SetPythonHome(directoryWhereMyOwnPythonScriptsReside); 
    Py_InitializeEx(0); 
    
    // forge Python command to set the lookup path 
    // add the zipped Python distribution library to the search path as well 
    snprintf(
        pycmd, 
        sizeof(pycmd), 
        "import sys; sys.path = ['%s/pylib-2.6.4.zip','%s']", 
        applicationDirectory, 
        directoryWhereMyOwnPythonScriptsReside 
    ); 
    
    // ... and execute 
    PyRun_SimpleString(pycmd); 
    
    // now all succeeding Python import calls should be able to 
    // find the other modules, especially those in the zipped library 
    
    ... 
    
    0

    Hay un programa llamado py2exe. No sé si solo está disponible para Windows. Además, la última versión que utilicé no incluye todo en un archivo .exe. Crea un montón de cosas que tienen que ser distribuidas: un archivo zip, etc.

    +0

    El título parece ser engañoso: Python está incrustado. No quiero tener el código de Python incrustado en el archivo ejecutable; el ejecutable se convertirá en secuencia de comandos al estar vinculado a Python. py2exe por lo tanto no es la solución. – Robert

    0

    Creo que aquí es la respuesta que desea Unable to get python embedded to work with zip'd library

    Básicamente, se necesita:

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

    en su/C++ código C para cargar la biblioteca estándar de Python.

    Y en su python27.zip, todo el código fuente .py se encuentran en python27.zip/Lib como se describe en la variable sys.path.

    Espero que esto ayude.

    Cuestiones relacionadas