2009-10-14 12 views
12

Estoy jugando con la combinación de buildout y virtualenv para configurar un entorno de desarrollo aislado de en python que permite hacer compilaciones reproducibles.Buildout y Virtualenv

Hay una receta para el buildout que te permite integrar virtualenv en buildout:

tl.buildout_virtual_python 

con este mi buildout.cfg se ve así:

[buildout] 
develop = . 
parts = script 
     virtualpython 


[virtualpython] 
recipe = tl.buildout_virtual_python 
headers = true 
executable-name = vp 
site-packages = false 

[script] 
recipe = zc.recipe.egg:scripts 
eggs = foo 
python = virtualpython 

Esto desplegará dos ejecutables en ./ bin /:

vp 
script 

Cuando ejecuto vp, obtengo un diálogo interactivo, aislado de python, como e xpected (no se puede cargar ningún paquete del sistema). lo que se espera ahora, es que si me quedo

./bin/script 

que se utiliza la pitón aislado intérprete. Pero no es así, no está aislado como "vp" es (lo que significa que puedo importar bibliotecas desde el nivel del sistema). Sin embargo, puedo ejecutar:

./bin/vp ./bin/script 

Que ejecutará el script en un entorno aislado como yo desee. Pero debe haber una forma de especificar esto para hacerlo sin encadenar los comandos. De lo contrario, buildout solo resuelve la mitad de los problemas que esperaba :)

¡Gracias por su ayuda! Patrick

Respuesta

8

No necesita virtualenv: buildout ya proporciona un entorno aislado, al igual que virtualenv.

Como ejemplo, observe los archivos que buildout genera en el directorio bin. Van a tener algo como:

import sys 
sys.path[0:0] = [ 
    '/some/thing1.egg', 
    # and other things 
    ] 

Así que la sys.path queda completamente reemplazado con lo buildout quiere tener en el camino: el mismo método de aislamiento como virtualenv.

+0

Lo bueno de virtualenv es que modifica el PATH para que los scripts puedan tener "#!/usr/bin/env python "como se supone que deben hacerlo y utilizarán la versión de compilación". ¿Es posible hacer esto sin virtualenv? – Xentac

+0

virtualenv modifica la ruta, pero eso también significa que no debe * olvidar * habilitar virtualenv cada vez que quiera usar el script. Buildout tiene una solución más permanente en ese sentido. Y buildout señala la línea "#! ..." de su script en la python real con la que se ejecutó su buildout, por lo que es correcta para su máquina. Sin virtualenv? Podría escribir un script de shell que establezca PYTHONPATH como algo específico y obtenga * algo * de la funcionalidad de virtualenv. Pero no todos, especialmente no cuando se instala. –

+7

Corrección rápida: 'sys.path [0: 0] = [...]' no reemplaza completamente a sys.path, simplemente inserta más elementos al principio. –

0

nunca he utilizado la receta antes, pero lo primero que me gustaría tratar es la siguiente:

[buildout] 
develop = . 
parts = script 
     virtualpython 


[virtualpython] 
recipe = tl.buildout_virtual_python 
headers = true 
executable-name = vp 
site-packages = false 

[script] 
recipe = zc.recipe.egg:scripts 
eggs = foo 
python = virtualpython 
interpreter = vp 

Si eso no funciona, por lo general puede abrir las secuencias de comandos (en este caso vp y script) en un editor de texto y ver las rutas de Python que están usando. Si está en Windows, generalmente habrá un archivo llamado <script_name>-script.py. En este caso, eso sería vp-script.py y script-script.py.

+0

También pensé en usar la opción "intérprete". Si lo hago, el código se romperá: djungle: buildout-test pbonzli $ ./bin/vp ./bin/vp: línea 3: importación: comando no encontrado ./bin/vp: línea 5: sys. ruta [0: 0]: comando no encontrado etc ... Quizás un error en el script, no sé ... – Patrick

3

Tuve un problema al ejecutar buildout usando bootstrap en el servidor de ubuntu, desde entonces utilizo virtualenv y buildout juntos. Simplemente cree virualenv e instale buildout en él. De esta forma, solo virtualenv debe instalarse en el sistema (en teoría).

$ virtualenv [options_you_might_need] virtual 
$ source virtual/bin/activate 
$ pip install zc.buildout 
$ buildout -c <buildout.cfg> 

También informe buildout para poner sus guiones en a/bin/directorio virtual, de esa manera los scripts aparecen en $PATH.

[buildout] 
bin-directory = ${buildout:directory}/virtual/bin 
... 

1: En la práctica es probable que necesite a los huevos lo requieren compilación a nivel de sistema que requiere la compilación. Huevos como mysql o memcache.

5

zc.buildout 2.0 y posterior ya no proporciona el entorno aislado.

Pero virtualenv 1.9 y posterior proporciona un aislamiento completo (incluso para no instalar las herramientas de configuración).

lo tanto, la forma más fácil de obtener un buildout en un ambiente controlado completa es ejecutar los siguientes pasos (aquí es decir, para ampliamente utilizado Python 2.7):

cd /path/to/buildout 
rm ./bin/python 
/path/to/virtualenv-2.7 --no-setuptools --no-site-packages --clear . 
./bin/python2.7 bootstrap.py 
./bin/buildout 

Condiciones previas:

  • bootstrap.py tiene que ser uno reciente que coincida con la versión de buildput que está utilizando. Encontrará la última en http://downloads.buildout.org/2/

  • si hay algunos pines de versión en su buildout, asegúrese de que no pinan buildout o recetas/extensiones a versiones no compatibles con zc.buildout 2 o posterior.

Cuestiones relacionadas