[PyVigo] "pip install" modificando shebang... es posible?

Luigi Pirelli luipir at gmail.com
Wed Nov 16 13:44:48 CET 2016


ole' la solucion 1) con pip2pi funciona... no genera shebang general
como: #!/user/bin/env python, pero encuentra corectamente el python
que se encuentra en el path de instalación, asi' que ya el problema
mas gordo es resuelto.

a ver si invertir mas tiempo en buscar la solución mas generica...
seria sencillo una PR en setuptools que busque el executable antes
averiguando si "/user/bin/env python" encuentra algo y conicide con
sys.executable y si no, poner sys.executable que siempre es path
asoluto.

gracias por la aayuda
Luigi Pirelli

**************************************************************************************************
* Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
* LinkedIn: https://www.linkedin.com/in/luigipirelli
* Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
* GitHub: https://github.com/luipir
* Mastering QGIS 2nd Edition:
* https://www.packtpub.com/big-data-and-business-intelligence/mastering-qgis-second-edition
**************************************************************************************************


2016-11-15 21:26 GMT+01:00 Luigi Pirelli <luipir at gmail.com>:
> mui bien... investigare' la opción 1 :)
> lo que hacemos ahora es exactamente la opcion 3) pero, como bien
> dices, no nos gusta para nada y la consideramos solo un apaño... la 2)
> no la tengo en consideración por las rasones que dices.
>
> muchas gracias de las ideas
> Luigi Pirelli
>
> **************************************************************************************************
> * Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
> * LinkedIn: https://www.linkedin.com/in/luigipirelli
> * Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
> * GitHub: https://github.com/luipir
> * Mastering QGIS 2nd Edition:
> * https://www.packtpub.com/big-data-and-business-intelligence/mastering-qgis-second-edition
> **************************************************************************************************
>
>
> 2016-11-15 19:44 GMT+01:00 José Juan Montes <jjmontes at gmail.com>:
>> Ahhh. Importante el hecho de que sean módulos fuera de vuestro control :).
>>
>> Lo de la ruta absoluta es normal. Cada vez que "pip / setuptools" instalan
>> un script, introducen el path completo al intérprete de Python (cuando usas
>> la opción "console_scripts" de la que hablábamos).
>>
>> Esto ha sido criticado, puesto que hace los entornos de Python dependientes
>> de la ruta de instalación (incluyendo también los entornos virtuales creados
>> con "virtualenv", que no se pueden mover sin recrearlos).
>>
>> Como no tengo claro del todo tu escenario, te comento algunas ideas que se
>> me ocurren:
>>
>> 1) No es _quizá_ la mejor práctica empaquetar en el build server todo un
>> entorno de Python. En Windows, esto hará la aplicación dependiente de la
>> versión de Python (x.y.z). Ciertamente no es el mayor problema si usas
>> OSGeo4W como base, ya que el intérprete de Python está fijado por el propio
>> OSGeo4W.
>>
>> Una alternativa es usar un repositorio local para las instalaciones. He
>> usado pip2py para esto, que es facilísimo
>> (http://stackoverflow.com/a/12525448/401656). También tienes pip-accel,
>> aunque no la he probado y me parece más engorrosa. De esta manera, tu
>> aplicación/entorno es más portable incluso aunque cambiase la versión de
>> Python de tu entorno de destino, sin necesidad de pasar por el build server,
>> y sin necesidad de conexión a la red. Tendrías que hacer la instalación de
>> pip una vez activado el entorno virtual (en tu caso el entorno de OSGeo4W).
>>
>> Haciéndolo así también instalará los archivos con los shebangs adecuados y
>> paths correspondientes al entorno Python de destino.
>>
>> 2) Por otra parte, puedes instalar tu aplicación y dependencias (incluyendo
>> IPython) en el entorno/ruta de destino que más te convenga. Aunque tu
>> paquete no debería ser dependiente de la ruta de instalación, si quisieras
>> hacerlo así, puedes hacer que tu entorno de Python utilice los paquetes que
>> ya están instalados por OSGeo4W. Yo sólo hago esto en entornos de
>> desarrollo, porque es más feo y engorroso y no me parece muy portable.
>>
>> En cualquier caso, para ello tendrías que crear un archivo
>> "sitecustomize.py" en el directorio Lib\site-packages de tu aplicación
>> (http://stackoverflow.com/questions/10693706/creating-a-secondary-site-packages-directory-and-loading-packages-from-pth-fil)
>>
>> import site
>> site.addsitedir('C:\\Program Files\\QGIS
>> Wien\\apps\\Python27\\Lib\\site-packages')
>>
>> Esto hace que la instalación de Python de tu segundo entorno
>>
>> Y a la hora de llamar a tu aplicación, tendrías que crear algún script que
>> prepare el entorno (lo que normalmente hace OSGeo4W o virtualenv). Te pongo
>> un ejemplo, pero en tu caso será diferente (el ejemplo es para QGIS, no para
>> OSGeo4W, y tendrás que adaptarlo):
>>
>> set GDAL_DATA="C:\Program Files\QGIS
>> Wien\apps\grass\grass-6.4.3\etc\ogr_csv"
>> set PATH="%PATH%;C:\Program Files\QGIS Wien\bin:C:\Program Files\QGIS
>> Wien\apps\Python27\Lib\site-packages\numpy\core"
>>
>> python your_application.py
>>
>> Esta segunda opción la he comentado a modo de ilustración. No me parece
>> recomendable excepto, como he dicho, para entornos de desarrollo, pero
>> expresa cómo mantener dos entornos de Python y utilizar los módulos del
>> primero desde el segundo, sin afectar al primer entorno (es decir, evitando
>> "ensuciar" la instalación de OSGeo4W).
>>
>> Y en este segundo caso, en Windows, sigues necesitando que ambos entornos
>> compartan la misma versión de Python (x.y.z) si tienes bibliotecas nativas,
>> así que tu paquete que sale del build server sería igualmente dependiente
>> del entorno de destino.
>>
>> 3) Por último, tienes la opción de añadir a tu instalación un script que
>> repase todos los shebang y los altere de acuerdo al entorno en el que está
>> instalado. Tampoco me gusta mucho, pero creo que sería la única forma de
>> instalar una aplicación Python dentro de OSGeo4W sin permitir que pip haga
>> la instalación.
>>
>> Sin tener claro tu caso, mi recomendación es la opción uno. Es muy fácil de
>> mantener, es más portable.
>>
>> Espero haberme explicado y que te sirva de algo. ¡Un saludo!.
>>
>>
>> Jose Juan Montes
>>
>> El 15 de noviembre de 2016, 11:13, Luigi Pirelli <luipir at gmail.com>
>> escribió:
>>>
>>> hmmmm... seguro no me explique bien
>>>
>>> no estoy hablando de scripts o modulos sobre que te tenemos "control",
>>> por ejemplo yo necesito instalarme ipython (en el entorno de execution
>>> de OSGeo4W) y esto se hace en el build server para que todo al final
>>> estea paquietizado sin mas neceistad de red.
>>>
>>> en el ipython.exe generado por pip, o lo que sea, hay enbedded un
>>> launcher con un shebang con path absoluto al interprete y lo que
>>> queria y decir a pip o pasar opciones a pip(y asi' a setuptool) para
>>> que el shebang en python.exe sea #!/usr/bin/env python.
>>>
>>> No se si me he explicado mejor o he complicado mas el asunto :)
>>>
>>> Luigi Pirelli
>>>
>>> ps. el mundo seria mas guasy sin winzozz y sin todas las
>>> complicaciones que este introduce
>>>
>>>
>>> **************************************************************************************************
>>> * Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
>>> * LinkedIn: https://www.linkedin.com/in/luigipirelli
>>> * Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
>>> * GitHub: https://github.com/luipir
>>> * Mastering QGIS 2nd Edition:
>>> *
>>> https://www.packtpub.com/big-data-and-business-intelligence/mastering-qgis-second-edition
>>>
>>> **************************************************************************************************
>>>
>>>
>>> 2016-11-14 17:31 GMT+01:00 José Juan Montes <jjmontes at gmail.com>:
>>> > PIP no utiliza distutils.
>>> >
>>> > PIP descomprime el paquete y llama a setup.py con un parámetro (install
>>> > o
>>> > bdist_wheel) dependiendo de cómo haya sido empaquetado el proyecto.
>>> >
>>> > setup.py importa setuptools o distutils, el desarrollador escoge cuál
>>> > usar.
>>> > Lo normal es usar setuptools hoy en día.
>>> >
>>> > PIP no genera ningún script ni escribe ningún shebang. Esto es tarea de
>>> > setuptools pero sólo cuando se usa "console_scripts". Cualquier otro
>>> > script
>>> > que hayas escrito, o generado, se mantendrá intacto.
>>> >
>>> > Saludos,
>>> >
>>> >
>>> > Jose Juan Montes
>>> >
>>> > El 14 de noviembre de 2016, 16:58, Luigi Pirelli <luipir at gmail.com>
>>> > escribió:
>>> >>
>>> >> usamos pip que me parece usa distutils
>>> >>
>>> >> por ejemplo yo instalo mis modulos lado build server con pip y este
>>> >> escribe un shebang relacionado con python del build server => path
>>> >> malo cuando se hace el install final.
>>> >>
>>> >> me gustaria decir a pip de poner la version mas universal que como
>>> >> dices es "#!/usr/bin/env python" ya que dependera' de los valores de
>>> >> PATH sobre que tenemos control... pero esto no soy capaz de ponerlo.
>>> >>
>>> >> itentere' ver y probar las opciones de "console_scripts" gracias
>>> >>
>>> >>
>>> >> Luigi Pirelli
>>> >>
>>> >>
>>> >>
>>> >> **************************************************************************************************
>>> >> * Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT com
>>> >> * LinkedIn: https://www.linkedin.com/in/luigipirelli
>>> >> * Stackexchange: http://gis.stackexchange.com/users/19667/luigi-pirelli
>>> >> * GitHub: https://github.com/luipir
>>> >> * Mastering QGIS 2nd Edition:
>>> >> *
>>> >>
>>> >> https://www.packtpub.com/big-data-and-business-intelligence/mastering-qgis-second-edition
>>> >>
>>> >>
>>> >> **************************************************************************************************
>>> >>
>>> >>
>>> >> 2016-11-14 16:47 GMT+01:00 José Juan Montes <jjmontes at gmail.com>:
>>> >> > Creo que no mencionas si usas setuptools o distutils.
>>> >> >
>>> >> > Si estás escribiendo el script a mano, el shebang recomendado es:
>>> >> >
>>> >> > #!/usr/bin/env python
>>> >> >
>>> >> > Para incluir el script en el paquete, y dejar que pip/setuptools lo
>>> >> > instale
>>> >> > en un directorio adecuado que esté en el path, usarías la opción
>>> >> > 'scripts'
>>> >> > de setuptools en setup.py.
>>> >> >
>>> >> > Por otra parte, como ha dicho Miguel, puedes apuntar directamente a
>>> >> > una
>>> >> > función en uno de los módulos, y dejar que setuptols genere el script
>>> >> > (que
>>> >> > debería funcionar en cualquier plataforma). Para ello, usarías la
>>> >> > opción
>>> >> > 'console_scripts'  en setup.py. En tu caso es posiblemente más
>>> >> > recomendable,
>>> >> > ya que en mi opinión tienes más garantías de que el script sea
>>> >> > portable.
>>> >> >
>>> >> > La documentación de ambas estrategias está en:
>>> >> >
>>> >> >
>>> >> >
>>> >> > http://python-packaging.readthedocs.io/en/latest/command-line-scripts.html
>>> >> >
>>> >> > En ambos casos, setuptools instalará el script a un directorio en el
>>> >> > path.
>>> >> > Por defecto, esto sería /usr/local/bin en Linux. Sin embargo, si
>>> >> > estás
>>> >> > usando un virtualenv, setuptools lo instalará correctamente a
>>> >> > env/bin/
>>> >> > (Linux) o a env/Scripts (Windows), que también están en el path
>>> >> > cuando
>>> >> > se
>>> >> > activa el virtualenv.
>>> >> >
>>> >> > ¡Un saludo!
>>> >> >
>>> >> >
>>> >> > Jose Juan Montes
>>> >> >
>>> >> > El 14 de noviembre de 2016, 16:08, Miguel González Álvarez
>>> >> > <migonzalvar at gmail.com> escribió:
>>> >> >>
>>> >> >> Hola Luigi.
>>> >> >>
>>> >> >> Sé que no es tu pregunta pero no sé si se podría resolver tu
>>> >> >> problemática
>>> >> >> usando el `console_scripts entry point`. En Windows, setuptools crea
>>> >> >> un
>>> >> >> archivo .exe que ejecuta el script. Te aseguras así que se ejecuta
>>> >> >> dentro
>>> >> >> del entorno.
>>> >> >>
>>> >> >> En
>>> >> >>
>>> >> >>
>>> >> >> http://setuptools.readthedocs.io/en/latest/setuptools.html#automatic-script-creation
>>> >> >> pone:
>>> >> >>
>>> >> >> > On Windows, a set of foo.exe, bar.exe, and baz.exe launchers are
>>> >> >> > created, alongside a set of foo.py, bar.py, and baz.pyw files. The
>>> >> >> > .exe
>>> >> >> > wrappers find and execute the right version of Python to run the
>>> >> >> > .py
>>> >> >> > or .pyw
>>> >> >> > file.
>>> >> >>
>>> >> >> Un saludo.
>>> >> >>
>>> >> >> 2016-11-14 15:49 GMT+01:00 Luigi Pirelli <luipir at gmail.com>:
>>> >> >>>
>>> >> >>> si esto si, por esto que pip hace una cosa rara (para mi)
>>> >> >>> construiendo
>>> >> >>> un .exe con un launcher
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> https://github.com/pypa/pip/blob/master/pip/_vendor/distlib/scripts.py#L205
>>> >> >>>
>>> >> >>>
>>> >> >>> Luigi Pirelli
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> **************************************************************************************************
>>> >> >>> * Boundless QGIS Support/Development: lpirelli AT boundlessgeo DOT
>>> >> >>> com
>>> >> >>> * LinkedIn: https://www.linkedin.com/in/luigipirelli
>>> >> >>> * Stackexchange:
>>> >> >>> http://gis.stackexchange.com/users/19667/luigi-pirelli
>>> >> >>> * GitHub: https://github.com/luipir
>>> >> >>> * Mastering QGIS 2nd Edition:
>>> >> >>> *
>>> >> >>>
>>> >> >>>
>>> >> >>> https://www.packtpub.com/big-data-and-business-intelligence/mastering-qgis-second-edition
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> **************************************************************************************************
>>> >> >>>
>>> >> >>>
>>> >> >>> 2016-11-14 15:33 GMT+01:00 Carlos Goce <carlosgoce at gmail.com>:
>>> >> >>> > Por si te sirve de ayuda. Sólo te puedo comentar que me parece
>>> >> >>> > que
>>> >> >>> > Windows
>>> >> >>> > ignora completamente los Shebang.
>>> >> >>> >
>>> >> >>> >
>>> >> >>> > El 14/11/2016 3:30 p. m., "Luigi Pirelli" <luipir at gmail.com>
>>> >> >>> > escribió:
>>> >> >>> >>
>>> >> >>> >> hmmmm... con mucha probabilidad non es un problema de setup pero
>>> >> >>> >> de
>>> >> >>> >> pip... creo que pip llega a crear el shebang de defauult aqui
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >> https://github.com/pypa/pip/blob/master/pip/_vendor/distlib/scripts.py#L152
>>> >> >>> >> Luigi Pirelli
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >> **************************************************************************************************
>>> >> >>> >> * Boundless QGIS Support/Development: lpirelli AT boundlessgeo
>>> >> >>> >> DOT
>>> >> >>> >> com
>>> >> >>> >> * LinkedIn: https://www.linkedin.com/in/luigipirelli
>>> >> >>> >> * Stackexchange:
>>> >> >>> >> http://gis.stackexchange.com/users/19667/luigi-pirelli
>>> >> >>> >> * GitHub: https://github.com/luipir
>>> >> >>> >> * Mastering QGIS 2nd Edition:
>>> >> >>> >> *
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >> https://www.packtpub.com/big-data-and-business-intelligence/mastering-qgis-second-edition
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >> **************************************************************************************************
>>> >> >>> >>
>>> >> >>> >>
>>> >> >>> >> 2016-11-14 15:06 GMT+01:00 Luigi Pirelli <luipir at gmail.com>:
>>> >> >>> >> > Hola
>>> >> >>> >> >
>>> >> >>> >> > tenemos un problema de epaquetamiento de modulos python... y
>>> >> >>> >> > especificatamente esto nos pasa en win.
>>> >> >>> >> >
>>> >> >>> >> > nos preparamos un installer en un build server, y en este
>>> >> >>> >> > build
>>> >> >>> >> > server
>>> >> >>> >> > instalamos los modulos que necesitamos => los scripts
>>> >> >>> >> > instalados
>>> >> >>> >> > tienen una stringa shebang echa asi'
>>> >> >>> >> >
>>> >> >>> >> > #!</path/to/python_in_build_server>
>>> >> >>> >> >
>>> >> >>> >> > esto es en general #!/user/bin/python o
>>> >> >>> >> > #!/user/local/bin/python
>>> >> >>> >> >
>>> >> >>> >> > pero a pasa la istalación en windows y usando un interprete
>>> >> >>> >> > python
>>> >> >>> >> > (embedded) nuesto #shebang tendría que ser
>>> >> >>> >> >
>>> >> >>> >> > #!</path/to/python_embedded>
>>> >> >>> >> > y esto puede cambiar en función de donde se instala el script.
>>> >> >>> >> >
>>> >> >>> >> > asi' que necesitariamos poner una stringa shebang que se la
>>> >> >>> >> > mas
>>> >> >>> >> > generica posible y que sea capaz de puntar al python embedded.
>>> >> >>> >> >
>>> >> >>> >> > en general sería guay solucionarlo con los build options de
>>> >> >>> >> > setup.py
>>> >> >>> >> > como en (el build server es winzozz)
>>> >> >>> >> > pip.exe install --global-option=build
>>> >> >>> >> > --global-option='--executable="/usr/bin/env python" ' <package
>>> >> >>> >> > name>
>>> >> >>> >> >
>>> >> >>> >> > pero el resultato siempre sale:
>>> >> >>> >> >
>>> >> >>> >> > #!python.exe
>>> >> >>> >> >
>>> >> >>> >> > asi' que puede ser que busca el executable y a no encontrarlo
>>> >> >>> >> > pone
>>> >> >>> >> > el
>>> >> >>> >> > default (estoy en el codigo de distutils viendo que hace)
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> > otra opción esn pyLauncher
>>> >> >>> >> > (https://www.python.org/dev/peps/pep-0397/)
>>> >> >>> >> > pero bno se cuanto sea una solución adoptada en el mundo
>>> >> >>> >> > python...
>>> >> >>> >> > el
>>> >> >>> >> > desarrollo de pyLancher es parado hace tiempo y no veo muchos
>>> >> >>> >> > que
>>> >> >>> >> > lo
>>> >> >>> >> > utilizan (pero podría equivocarme)
>>> >> >>> >> >
>>> >> >>> >> > asi' venimos a la PREGUNTA
>>> >> >>> >> >
>>> >> >>> >> > hay una forma de pasar parametros a setup.py para que se pueda
>>> >> >>> >> > setear
>>> >> >>> >> > la stringa shebang?
>>> >> >>> >> >
>>> >> >>> >> > Luigi Pirelli
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> > **************************************************************************************************
>>> >> >>> >> > * Boundless QGIS Support/Development: lpirelli AT boundlessgeo
>>> >> >>> >> > DOT
>>> >> >>> >> > com
>>> >> >>> >> > * LinkedIn: https://www.linkedin.com/in/luigipirelli
>>> >> >>> >> > * Stackexchange:
>>> >> >>> >> > http://gis.stackexchange.com/users/19667/luigi-pirelli
>>> >> >>> >> > * GitHub: https://github.com/luipir
>>> >> >>> >> > * Mastering QGIS 2nd Edition:
>>> >> >>> >> > *
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> > https://www.packtpub.com/big-data-and-business-intelligence/mastering-qgis-second-edition
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> >
>>> >> >>> >> > **************************************************************************************************
>>> >> >>> >> _______________________________________________
>>> >> >>> >> Asociación Python España: http://www.es.python.org/
>>> >> >>> >> Python Vigo: http://www.python-vigo.es/
>>> >> >>> >> Vigo mailing list
>>> >> >>> >> Vigo at lists.es.python.org
>>> >> >>> >> https://lists.es.python.org/listinfo/vigo
>>> >> >>> >
>>> >> >>> >
>>> >> >>> > _______________________________________________
>>> >> >>> > Asociación Python España: http://www.es.python.org/
>>> >> >>> > Python Vigo: http://www.python-vigo.es/
>>> >> >>> > Vigo mailing list
>>> >> >>> > Vigo at lists.es.python.org
>>> >> >>> > https://lists.es.python.org/listinfo/vigo
>>> >> >>> _______________________________________________
>>> >> >>> Asociación Python España: http://www.es.python.org/
>>> >> >>> Python Vigo: http://www.python-vigo.es/
>>> >> >>> Vigo mailing list
>>> >> >>> Vigo at lists.es.python.org
>>> >> >>> https://lists.es.python.org/listinfo/vigo
>>> >> >>
>>> >> >>
>>> >> >>
>>> >> >>
>>> >> >> --
>>> >> >> Miguel González
>>> >> >> migonzalvar at gmail.com
>>> >> >> PGP ID: 0C63761BEEBD05D3
>>> >> >>
>>> >> >> _______________________________________________
>>> >> >> Asociación Python España: http://www.es.python.org/
>>> >> >> Python Vigo: http://www.python-vigo.es/
>>> >> >> Vigo mailing list
>>> >> >> Vigo at lists.es.python.org
>>> >> >> https://lists.es.python.org/listinfo/vigo
>>> >> >
>>> >> >
>>> >> >
>>> >> > _______________________________________________
>>> >> > Asociación Python España: http://www.es.python.org/
>>> >> > Python Vigo: http://www.python-vigo.es/
>>> >> > Vigo mailing list
>>> >> > Vigo at lists.es.python.org
>>> >> > https://lists.es.python.org/listinfo/vigo
>>> >> _______________________________________________
>>> >> Asociación Python España: http://www.es.python.org/
>>> >> Python Vigo: http://www.python-vigo.es/
>>> >> Vigo mailing list
>>> >> Vigo at lists.es.python.org
>>> >> https://lists.es.python.org/listinfo/vigo
>>> >
>>> >
>>> >
>>> > _______________________________________________
>>> > Asociación Python España: http://www.es.python.org/
>>> > Python Vigo: http://www.python-vigo.es/
>>> > Vigo mailing list
>>> > Vigo at lists.es.python.org
>>> > https://lists.es.python.org/listinfo/vigo
>>> _______________________________________________
>>> Asociación Python España: http://www.es.python.org/
>>> Python Vigo: http://www.python-vigo.es/
>>> Vigo mailing list
>>> Vigo at lists.es.python.org
>>> https://lists.es.python.org/listinfo/vigo
>>
>>
>>
>> _______________________________________________
>> Asociación Python España: http://www.es.python.org/
>> Python Vigo: http://www.python-vigo.es/
>> Vigo mailing list
>> Vigo at lists.es.python.org
>> https://lists.es.python.org/listinfo/vigo


More information about the Vigo mailing list