Un lanzador en python

Chema Cortés chemacortes en wanadoo.es
Jue Mar 28 18:34:49 CET 2002


Hola, ajpv en alu.ua.es:
En respuesta a tu mensaje del Mié 27 Mar 2002 18:48:

> He intentado embeber una aplicacion de python en este programa en
> C++, pero falla al ejecutar.
>
>  FILE * f;
>  f = fopen("prog.py", "r");
>  Py_Initialize();
>  PyRun_SimpleFile(f, "log.txt");
>  Py_Finalize();
>
> en un principio solo hago esto. Lo que pasa es que no es capaz de
> ejecutar la llamada a PyRun_SimpleFile();. ¿Sera por usar Tkinter?

No tengo mucha experiencia con el tema, pero he probado el código y lo he 
hecho funcionar con Tkinter.

Puede que tengas problemas con el linker. En el manual de python explica que 
hay un problema con las librerías dinámicas cuando empotras el python y como 
se resuelve (con la opción -export-dynamic del linker).

También debes añadir estas dos líneas más a tu código:

int main(int argc, char **argv) {
//...
    Py_SetProgramName(argv[0]);
    Py_Initialize();
    PySys_SetArgv(argc, argv);
//...

}

El Tkinter utiliza sys.argv[0], con lo que debe de estar inicializado 
convenientemente.

Si sigues teniendo problemas, sería mejor que nos pusieras la salida de 
errores del compilador para hacernos una idea. Entre los fuentes del python, 
tienes en el directorio Demos/embed un ejemplo de un programa con el 
intérprete python empotrado.


> Solo puedo usar python embebido si es para funciones con tipos de
> datos propios de python.

No debería ser así. Tan sólo tienes que realizar una conversión del tipo 
("casting"). Puede que no entienda bien la pega que pones. Tienes funciones 
que te facilitan la conversión de tipos de datos entre ambos lenguajes (eg: 
PyArg_ParseTuple ó Py_BuildValue). Para realizar cálculos te debería sobrar; 
pero aunque así no fuera, aún te quedaría la posibilidad de crearte nuevos 
tipos de datos en python.

Con lo que sí deberás tener cuidado es con las cadenas de caracteres. En 
Tkinter se codifican en unicode (sizeof(u'ñ')!=1), por lo que no deberías 
utilizar las strings de C y emplear siempre las de python.

Por cierto, el tema de empotrado del python está algo mejor explicado en la 
la documentación del python 2.2. Si no lo tienes instalado, puedes consultar 
dicha documentación en

http://www.python.org/doc/current/ext/embedding.html
http://www.python.org/doc/current/api/api.html


Saludos,
-- 
Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 7.3
  ZARALINUX  http://www.zaralinux.org | "La ignorancia se apodera de quien
    PYTANDO  http://pytando.sf.net    |     se contenta con lo que sabe"


Más información sobre la lista de distribución Python-es