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

José Juan Montes jjmontes at gmail.com
Tue Nov 15 19:44:25 CET 2016


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.es.python.org/pipermail/vigo/attachments/20161115/f794f5a4/attachment-0001.html>


More information about the Vigo mailing list