2012-06-27 9 views
5

Me gustaría tener un solo binario grande que incorpore el intérprete de Python y un pequeño script. Soy totalmente nuevo en este conjunto de enlaces estáticos, configure & make y GCC et al. Por favor, ¿podría alguien describirme los pasos básicos para construir tal ejecutable?Incrustación de Python

Estoy en MacOS 10.6, descargué Python 3.3 beta. A continuación, he creado "test.c":

#include <Python.h> 

int 
main(int argc, char *argv[]) 
{ 
    Py_Initialize(); 
    PyRun_SimpleString("from time import time,ctime\n" 
        "print('Today is', ctime(time()))\n"); 
    Py_Finalize(); 
    return 0; 
} 

Ahora, en una carpeta, tengo tanto carpeta "Python-3.3.0b1" y el archivo "test.c".

Mecanografié:

gcc -I ./Python-3.3.0b1 -o test test.c 

pero me dieron un montón de errores "incluir".

Pero ni siquiera estoy seguro de si esta es la manera correcta de proceder ...? ¿Debo primero construir solo Python y luego "vincularlo" con "test.c"?

Por cierto, si Python se libera ¿usan el mismo procedimiento de "./configure" y "make"? ¿Utilizan algunas opciones especiales o puedo crear un ejecutable de Python muy similar (el mismo) que el proporcionado por python.org?

Además, probé este "./configure" y "make" y creó una carpeta llamada "build/lib.macosx-10.6-x86_64-3.3" con muchos archivos * .so (?) Pero hay nada llamado "pitón" o similar ...?

+0

archivo de encabezado en la ruta? –

+0

¿Por qué estás usando una versión beta de python? Además de eso, incluso si enlazas estáticamente con python en tu aplicación, necesitarás todo el material stdlib que es el código python y por lo tanto no se puede vincular simplemente con tu binario. – ThiefMaster

+0

Realmente no me importa la versión beta. Acabo de leer que la técnica de inserción cambió ligeramente de v2 a v3. –

Respuesta

2

¿Ha considerado usar py2app? Si solo está interesado en enviar un script y no escribir el código C, podría ajustarse mejor a sus necesidades.

http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html

+0

Gracias, sé acerca de py2app. Sin embargo, lo que trato de lograr es aprender cómo funciona esta incrustación y compilación, especialmente para Python, y me gustaría intentar escribir un poco sobre C. –

2

El problema es que gcc no sabe lo suficiente acerca de su instalación de Python y no es la vinculación de todas las cabeceras correctamente. Debe obtener esa información del distutils y tratar de averiguar cómo obtener esa información en gcc. Esto se explica mejor en el Linking Requirements de la sección Incrustación de la documentación de Python.

Pero hay una manera más fácil. Hay un script llamado pymkfile.py que creará un archivo make que incluye toda la información que necesita. Ver la Sección 4 de this tutorial.

De la Sección 4, un muy ejemplo similar a lo que estás tratando de hacer:

El método más simple de incrustación de código Python es usar la función PyRun_SimpleString(). Esta función envía una sola línea de código al intérprete . Como el intérprete es persistente, es como escribir las líneas individuales en una sesión interactiva de Python, lo que significa que puede ejecutar nuevas líneas en el intérprete llamando a PyRun_SimpleString con cada línea de código. Por ejemplo, el siguiente código se ejecuta un programa Python sencilla para dividir y volver a montar una cadena:

#include <Python.h> 
int main() 
{ 
printf("String execution\n"); 
Py_Initialize(); 
PyRun_SimpleString("import string"); 
PyRun_SimpleString("words = string.split('rod jane freddy')"); 
PyRun_SimpleString("print string.join(words,', ')"); 
Py_Finalize(); 
return 0; 
} 

se puede ver que la estructura básica es simple. Tiene los pasos de inicialización y finalización , e incrustados entre son las llamadas al intérprete de Python.Para compilar el programa , copie el código y guárdelo en un archivo llamado pystring.c. En primer lugar, utilizar el script para construir un Makefile adecuada:

$ pymkfile.py pystring > Makefile 

Ahora, ejecute make construir realmente el código. Una vez creada la aplicación final, ejecutar la aplicación para ver los resultados:

$ ./pystring 

String execution 
rod, jane, freddy 

Usted acaba ejecutado un simple bit de código Python mediante el uso de un envoltorio C. Puede usar la misma técnica básica para realizar muchas tareas diferentes que usan Python embedded en una aplicación. La única limitación obvia es que, en esencia, los dos componentes están separados. No hay comunicación entre el intérprete de Python incorporado y la aplicación de host C.

Así que le diste un código al intérprete y lo ejecutó e imprimió; observe cómo no tuvo que tomar el resultado del intérprete, luego imprimirlo: el intérprete envió la información directamente al resultado estándar.

+0

Lo siento pero no lo entiendo del todo. 1.) No tengo "instalación de Python" - bueno, MacOS tiene Python, pero trato de usar los archivos fuente que acabo de descargar. 2.) "Este es un problema cuando la aplicación está vinculada a la biblioteca de tiempo de ejecución estática (libpython.a) y necesita cargar extensiones dinámicas (implementadas como archivos .so)". ¿Necesito * .a o * .so? ¿Es posible usar solo los archivos fuente? Lo siento, soy muy nuevo en todo esto. –

+0

Tiene una instalación de Python que se incluye con MacOS y su programa C necesita estar vinculado a los archivos que se incluyen en esa instalación para ejecutar el código de Python incorporado. Como no le está diciendo a gcc dónde están esos archivos, obtiene errores de vinculador (incluidos). Es posible incluir manualmente los archivos fuente, pero es un dolor en el culo. En su lugar, use la secuencia de comandos del tutorial que he vinculado. Luego, para vincular correctamente la aplicación a la instalación de Python, debe haber dos comandos simples, 1) './pymkfile.py myCapp> Makefile' que creará el archivo make seguido de 2)' make' –

+0

Un poco más sobre ' make': http://www.network-theory.co.uk/docs/gccintro/gccintro_16.html –

1

Además, he intentado esto "./configure" y "hacer" y que hizo una carpeta llamado "build/lib.macosx-10.6-x86_64-3.3" con una gran cantidad de archivos * .so (?) pero no hay nada llamado "python" o similar ...?

Los archivos .so son archivos objeto. El ejecutable de Python se produce sólo después de llamar make install, por lo que los tres pasos:

./configure 
make 
make install 

Ese último paso implica generalmente sudo

Asegúrese de que no va a instalar su sistema Python. No es una buena idea.

Si está en OS X, el método habitual es vincular con el sistema de sistema OS X Python. Esto se ve como Python integrado, pero estás enlazando al sistema existente Python. El objetivo del enlace del sistema Python es libpython.dylib en /usr/lib

Si no está en contra de utilizar Xcode, simplemente busque 'Python OS X' incorporado y encuentre un buen tutorial.

Utilicé THIS tutorial primera vez que lo hice.

Cuestiones relacionadas