[pyar] Correr un script de python dentro de un programa en C

Emanuel Benatti emanuel.benatti en gmail.com
Vie Feb 7 11:30:00 ART 2014


Revise y efectivamente los sys.path de ambos script son diferentes. Mirando
un poco más me encontré con que el python que ejecuta el comando system es
el que se encuentra en el directorio de Cygwin. Por otro lado, al correr
python en la línea de comandos (la de windows, no la de cygwin), se ejecuta
el python de que se encuentra en el directorio WinPython. Hice la
verificación, y ambas versiones son iguales, es decir, no sólo tienen el
mismo número de versión, sino que además tienen instalados los mismos
módulos.

Más allá de la (tal vez inútil) redundancia de tener dos versiones
idénticas de python en la misma máquina, al encontrarme con esta situación,
lo que pensé fue el python de cygwin no tenía el módulo numpy o alguno de
los mencionados en el mensaje de error. Lo que hice para verificarlo fue
buscar cada uno de los .py que aparecen en el mensaje de error en los
directorios mencionados al correr sys.path (en el python de cygwin, que es
que utiliza la función system). No faltaba ni uno. Es más, al importar
(desde el python de cygwin) cada uno de los módulos que se mencionaban en
el mensaje de error todo andaba más que bien. Tampoco había error corriendo
el .py desde la terminal de cygwin.

Por otro lado, en la lista de SciPy me dijeron que este podía ser un bug
exclusivo de Windows[1], por lo que me puse a buscar un método alternativo
para correr el script de python y me encontré que existe una librería
llamada windows.h que tiene una función llamada CreateProcess que permite
correr aplicaciones en la línea de comando de windows. Así que lo que
termine haciendo fue convertir el .py en .exe utilizando py2exe y para
luego correr el ejecutable creado utilizando la función CreateProcess.

Estaba por escribir que había encontrado la solución cuando leí el mail de
Ángel que decía que el podía correr todo sin problemas. Esto tiraba un poco
abajo lo que estaba pensando... lo cual me agrego un poco más de confusión
al problema. Lo que terminé haciendo para verificar si efectivamente era un
problema de versión, fue desinstalar el python de cygwin, de modo de
obligar a system a buscar la versión de python que andaba... y el problema
se solucionó!

Que es lo que faltaba en el python de cygwin que impedía importar
correctamente numpy? No tengo ni idea y creo que nunca lo sabré, pero
claramente el problema andaba por ahí.

Gracias a todos!
No sólo solucione el problema que tenía sino que además encontré una forma
alternativa de hacer las cosas.

[1]
http://mail.scipy.org/pipermail/numpy-discussion/2009-December/047075.html
 Bien, recien probe:

Windows Server 2008
32 bits
Python 2.7 en el path
Me baje el numpy de
http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
corri el instalador

Mi programa python mypython.py

import numpy
print "hello, world"


Mi programa myc.c

#include <stdlib.h>
#include <stdio.h>

int main(){
    char py_cmd[200];

    sprintf(py_cmd, "python mypython.py");
    system(py_cmd);

}

Mi programa python funciona con

python mypython.py

Agrege el DevKit para compilar

gcc myc.c

ejecuto a.exe y anda joya

Tenes info de:

- Que PATH estas usando?
- Como compilas el programa c?
- Que pasa si llamas a un programa python que muestre el sys.path,
diferencias entre llamarlo a mano, y desde c?
- Tu python realmente esta en /usr/lib/python27 o el cargador de numpy se
confundio y detecto que cree estar en un linux o similar?

Nos leemos!

Angel "Java" Lopez
@ajlopez





2014-02-05 9:35 GMT-03:00 Emanuel Benatti <emanuel.benatti en gmail.com>:

> Hola a todos,
>
> estoy tratando de correr un script hecho en python dentro del código de un
> programa hecho en C. Me pareció que lo mas sencillo era utilizar la función
> system de C, asi que después de un par de intentos di con lo que parecía
> ser la fórmula correcta. Sin embargo, cuando quiero correr un script que
> requiere importar numpy obtengo el siguiente mensaje de error:
>
> Traceback (most recent call last):
>   File "pyemb.py", line 1, in <module>
>     import numpy
>   File "/usr/lib/python2.7/site-packages/numpy/__init__.py", line 137, in
> <module>
>     import add_newdocs
>   File "/usr/lib/python2.7/site-packages/numpy/add_newdocs.py", line 9, in
> <module>
>     from numpy.lib import add_newdoc
>   File "/usr/lib/python2.7/site-packages/numpy/lib/__init__.py", line 13,
> in <module>
>     from polynomial import *
>   File "/usr/lib/python2.7/site-packages/numpy/lib/polynomial.py", line
> 17, in <module>
>     from numpy.linalg import eigvals, lstsq
>   File "/usr/lib/python2.7/site-packages/numpy/linalg/__init__.py", line
> 48, in <module>
>     from linalg import *
>   File "/usr/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 23,
> in <module>
>     from numpy.linalg import lapack_lite
> ImportError: No such file or directory
>
> Esto es lo que pongo en el codigo en c:
> #include <stdlib.h>
> #include <stdio.h>
>
> int main(){
>     char py_cmd[200];
>
>     sprintf(py_cmd, "python pyemb.py");
>     system(py_cmd);
>
> }
>
> siendo pyemb.py:
> import numpy
> print "all fine with the world"
>
>
> Lo mas extraño de todo es que si en la linea de comandos corro el comando:
> python pyemb.py
>
> todo resulta como debe ser.
>
> Estoy realmente perdido en esto. ¿Qué diferencia puede haber en correr el
> comando usando system que haciéndolo directamente?
>
> Probé tambien importar otros módulos, como subprocess, math, y sys y no
> tuve ningún problema.
>
> Estoy usando python 2.7 en windows XP.
>
> En la computadora también hay instalado un python 2.5, aunque cuando
> escribo "python" en la línea de comandos el intérprete que me sale es el de
> la versión 2.7, así que no creo que el problema pase por ahí. ¿Estoy en lo
> correcto?
>
> Muchas gracias
> --
> Emanuel
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>


_______________________________________________
pyar mailing list pyar en python.org.ar
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140207/42d7f75a/attachment-0001.html>


More information about the pyar mailing list