Ubuntu + virtualenv = ¿un desastre? virtualenv odia los paquetes dist, quiere los paquetes del sitio

StackOverflow https://stackoverflow.com/questions/1215610

Pregunta

¿Puede alguien explicarme qué está pasando con python en ubuntu 9.04?

Estoy tratando de activar virtualenv , y la bandera --no-site-packages parece no hacer nada con ubuntu. Instalé virtualenv 1.3.3 con easy_install (que he actualizado a setuptools 0.6c9 ) y todo parece estar instalado en /usr/local/lib/python2.6/dist-packages

Asumo que al instalar un paquete usando apt-get, se coloca en /usr/lib/python2.6/dist-packages/ ?

El problema es que hay un /usr/local/lib/python2.6/site-packages que también se queda vacío. Parecería (mirando la ruta en un virtualenv ) que esta es la carpeta que virtualenv usa como respaldo. Por lo tanto, incluso aunque omitiera --no-site-packages , no puedo acceder a mis paquetes de sistemas locales desde ninguno de mis virtualenv.

Entonces mis preguntas son:

  1. ¿Cómo consigo que virtualenv apunte a uno de los dist-packages ?
  2. ¿Qué paquetes dist debo señalar? /usr/lib/python2.6/dist-packages o /usr/local/lib/python2.6/dist-packages/
  3. ¿Cuál es el punto de /usr/lib/python2.6/site-packages ? ¡No hay nada allí!
  4. ¿Es por orden de llegada en el camino? Si tengo una versión más nueva del paquete XYZ instalada en /usr/local/lib/python2.6/dist-packages/ y una más antigua (de ubuntu repos / apt-get) en /usr/lib/python2.6/dist-packages , ¿cuál se importa cuando import xyz ? Supongo que esto se basa en la lista de rutas, ¿sí?
  5. ¿Por qué demonios es esto tan confuso? ¿Hay algo que me falta aquí?
  6. ¿Dónde se define que easy_install debería instalarse en /usr/local/lib/python2.6/dist-packages ?
  7. ¿Esto afectará también a pip ?

¡Gracias a cualquiera que pueda aclarar esto!

¿Fue útil?

Solución

Me sentiría tentado a piratearlo haciendo que los paquetes del sitio sean un enlace a los paquetes dist, pero supongo que esto podría afectar otros casos en los que desee instalar alguna extensión que no sea ubuntu dist. No puedo pensar en otra respuesta a 1, excepto ajustar las fuentes de virtualenv (con ubuntu y virtualenv siendo tan populares que no me sorprendería encontrar que ya existen versiones ajustadas).

Re 2, si está usando / usr / local / bin / python, debe usar la versión / usr / local de la lib (incluidos los paquetes del sitio) y, por el contrario, si está usando / usr / bin / python .

Re 3, habrá algo allí si alguna vez instala una extensión para / usr / bin / python desde las fuentes (no a través de easy_install o desde la distribución de ubuntu).

Re 4, sí, las entradas anteriores en la ruta tienen prioridad.

Re 5, easy_install es fácil solo en su nombre: hace tanta magia oscura que se ha mantenido cuidadosamente fuera de la biblioteca estándar de Python a pesar de su conveniencia porque el consenso entre nosotros es la magia oscura profunda por conveniencia. " fácil " solo en la superficie.

Re 6, creo que es una modificación de ubuntu para easy_install; si es así, se define donde Canonical u otros mantenedores de ubuntu toman sus decisiones colectivas.

Re 7, lo siento, no tengo idea, no tengo ubuntu razonablemente reciente para verificar.

Otros consejos

Creo que la respuesta de Mike Orr de la lista de correo virtual-env parece ser la mejor. Tenga en cuenta que el OP publicó esta pregunta en ambos lugares.

Contenido original del correo:

Hace años Debian creó / usr / local / lib / pythonVERSION / site-packages, y compiló el binario de Python para incluirlo en la búsqueda predeterminada camino. Ubuntu siguió el ejemplo de Debian como lo hace normalmente. El pitón a los desarrolladores no les gustó esto porque tendrías interferencia con un localmente instalado / usr / local / bin / python usando los mismos paquetes de sitio directorio. Ubuntu finalmente decidió abandonar los paquetes del sitio y usar dist-packages, un nombre que inventaron para que no interferir con cualquier cosa. La historia de Loing está ahí afuera en algún lado si lo buscas en Google, en algún lugar del rastreador de errores de Python o distutils SIG o tal.

El sistema funciona, al menos si usa el paquete virtualenv de Ubuntu. Algunas personas han tenido problemas al usar un virtualenv instalado localmente en Ubuntu porque las entradas mágicas sys.path no se agregaron o alguna cosa. No estoy seguro acerca de --no-site-packages porque nunca uso esa opción: ejecuto PIL y mysqldb desde los paquetes de Ubuntu porque A veces puede ser difícil compilar sus dependencias de C. (Necesita el archivos de encabezado derecho, Python ignora los archivos de encabezado, etc.)

Entonces los paquetes de Ubuntu Python entran / usr / lib / pythonVERSION / dist-packages. O ese soporte de Python directorio por alguna razón. Los paquetes de Python instalados localmente entran en / usr / local / lib / pythonVERSION / dist-packages por defecto. Cada vez que yo instalo un sistema Ubuntu 9.04 que ejecuto:

$ sudo apt-get install python-setuptools (6.0c9) $ sudo apt-get install python-virtualenv (1.3.3) $ sudo pip easy_install $ sudo pip install virtualenvwrapper

Los virtualenvs funcionan bien de esta manera, aunque no he probado --no-site-packages.

  

Estoy tratando de activar virtualenv, y la bandera --no-site-packages   parece no hacer nada con ubuntu. Instalé virtualenv 1.3.3 con   easy_install (que he actualizado a setuptools 0.6c9)

Estas versiones están en Ubuntu 9.04, por lo que lo estás haciendo más difícil usted mismo instalándolos localmente.

  

y todo   parece estar instalado en /usr/local/lib/python2.6/dist-packages

  

Supongo que al instalar un paquete usando apt-get, se coloca en /   usr / lib / python2.6 / dist-packages /?

  
      
  1. ¿Es por orden de llegada en el camino? Si tengo uno nuevo   versión del paquete XYZ instalada en /usr/local/lib/python2.6/dist-   paquetes / y versiones anteriores (desde ubuntu repos / apt-get) en / usr / lib /   python2.6 / dist-packages, ¿cuál se importa cuando importo xyz?   Supongo que esto se basa en la lista de rutas, ¿sí?
  2.   

sys.path se escanea en orden. Lo único gracioso es que los huevos .pth obtener más temprano o más tarde en el camino de lo que algunas personas esperan. Pero si está usando pip para todo lo que puede hacer (es decir, excepto para instalar pip en sí, huevos precompilados y una instantánea de un directorio local que es un copiar en lugar de un enlace de huevo), de todos modos no tendrá muchos huevos .pth.

  
      
  1. ¿Por qué demonios es esto tan confuso? Hay algo que soy   falta aquí?
  2.   

No está bien documentado. Lo descubrí escaneando la web.

  
      
  1. ¿Esto también afectará a pip?
  2.   

Sí, pip se instalará automáticamente en / usr / local / lib / pythonVERSION / site-packages. Use " pip install -E $ VIRTUAL_ENV nombre del paquete " instalar en un virtualenv.

Realmente no deberías tocar la instalación de Python de Ubuntu a menos que estés construyendo herramientas de administración del sistema, o construyendo algo que pueda considerarse como un nuevo servicio del sistema.

Si está utilizando Ubuntu para desarrollar o implementar aplicaciones de Python, siempre construya su propio Python desde la fuente, alíselo y úselo para la implementación. De esta forma, tendrá todos los directorios en el lugar correcto y virtualenv funcionará normalmente. Si va a implementar varias aplicaciones Python en el servidor, haga que su Python esté en vivo en algún lugar como / home / python o / opt / python o en algún lugar fuera de su directorio de inicio . Asegúrese de tener permisos de escritura para el grupo de desarrolladores ( usuarios ?) Para que las personas puedan agregar paquetes fácilmente.

Esto también le permite tener dos niveles de paquetes. Las que son sus herramientas estándar internas pueden instalarse en su distribución Python y ser parte del tarball que implementa, y solo los paquetes específicos de la aplicación estarían en un virtualenv.

No actualice ni modifique el sistema Ubuntu instalado Python.

Bueno, tengo un Ubuntu 9.04 y rápidamente intenté configurar un par de sandboxes con paquetes de sitio y uno sin ellos. Y las cosas funcionan bien.

La única diferencia en el enfoque que tomé es que usé el paquete python-virtualenv de Ubuntu (1.3.3). Y supongamos que el equipo de Ubuntu lo modificó para adaptarse a las configuraciones de Ubuntu.

Para resumir, deshabilite virtualenv easy_installed por un tiempo, use python-virtualenv empaquetado y vea si eso cumple con sus expectativas.

De hecho, utilizamos una configuración similar para la producción sin ningún problema. El descanso ya fue respondido por Alex.

Otra forma de solucionarlo:
https://stackoverflow.com/a/17265840/202168

Debe recordar hacer eso en cada virtualenv donde lo necesite, pero no dependa de hacks o una versión especial de virtualenv

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top