2011-08-22 12 views
17

Seguí buscando respuesta, pero no encontré ninguna. Tengo un directorio env virtual, un directorio de proyecto con un req.txt. Cuando ejecuto pip -r req.txt, instala algunas aplicaciones de github (fuente) y algunas de pypi. Los de pypi están bien después de la llamada reubicable en la tarjeta virtual, sin embargo, los enlaces en los paquetes de sitio para las aplicaciones que instaló desde github aún apuntan a la ubicación anterior del directorio.virtualenv reubicable - ¿realmente funciona

¿Alguien más ha visto este comportamiento? ¿Alguna forma rápida de hacerlo? Además, reubicable no respeta el indicador --no-site-packages que se utilizó originalmente en el virtualenv. Una vez que mueve el virtual y lo reactiva, todo es visible desde los paquetes del sitio del sistema. Docs indica este comportamiento como un hecho, por lo que me pregunto si hay alguna forma rápida de evitarlo.

+0

¿Qué es "una llamada reubicable en el entorno virtual"? – hughdbrown

+0

Recuerde aceptar respuestas a sus preguntas. Haga esto haciendo clic en la marca de verificación junto a la más útil. Por favor, vuelve y hazlo por tus viejas preguntas respondidas también. – agf

+0

No entiendo por qué quieres mover tus virtualenvs. Los tengo en '~/.virtualenvs' y ya terminé. Sin despeinarse sin problemas. – hughdbrown

Respuesta

12

Como se indica en the documentation--relocatable es una opción experimental, por lo que no es sorprendente que tenga problemas con ella. Dicho esto, ¿recordó volver a ejecutar --relocatable después de instalar nuevos paquetes? Si instaló los paquetes de github con -e, eso podría ser un problema, ya que no se instala en paquetes de sitio, sino que contiene enlaces simbólicos. Como alternativa al uso de --relocatable, generalmente puede borrar los archivos específicos de virtualenv y volver a crearlos en su lugar (lo he hecho un par de veces al cambiar entre plataformas).

+0

Además, he usado '--relocatable' y lo encontré muy bien. Por supuesto, debe ejecutarlo justo antes de reubicarse para asegurarse de que no se pierda nada, como usted dice. – Marcin

10

No, para uno '--relocatable' no actualiza el script 'virtualenv/bin/activate'. Sí, puede solucionarlo volviendo a ejecutar la configuración de env virtual como lo sugirió zeekay, sin embargo, las imágenes fijas no pueden importar ninguna instalación 'pip -e git ...' que se coloque en 'virtualenv/src', por lo que tendrá que volver a ejecutar esas instalaciones pip manualmente.

Desde la experiencia hoy en día no instalo con pip editable (-e) y si es necesario clono manualmente repositorios en 'project/src /' en contraposición a 'project/virtualenv/src' y tengo el siguiente script auto_prep_pythonpath.py cargado antes de lanzar mi proyecto (lo hago referencia en mi script django.wsgi).

Como nota al margen agrego 'adaptado' a los paquetes colocados en 'project/src' que están modificados/pirateados así que no tengo que preocuparme por la compatibilidad con versiones anteriores y rastrear todas las fuentes bajo control de código como repositorios en línea pueden y van a frenar en usted.

Espero que esto ayude.

""" 
Prepares python path to include additional project/src/<APP> in PYTHONPATH - This file gets automatically loaded by projects __init__.py 

This script lives in 'project/src/django-project/auto_prep_pythonpath.py', modify 
'SOURCE_ROOT' if you place it somehwere else. 
""" 
import logging 
import os 
import sys 
SOURCE_ROOT = os.path.dirname(os.path.abspath(__file__)).replace('\\','/') # the replacements are when on windows 
SOURCE_ROOT = os.path.join(SOURCE_ROOT, '../').replace('\\','/') 
SOURCE_ROOT = os.path.normpath(SOURCE_ROOT) 

logger = logging.getLogger(__name__) 

logger.info("Adding packages in 'src/*' required by project to PYTHONPATCH.") 
dirlist_arr = os.listdir(SOURCE_ROOT) 
while dirlist_arr: 
    item_path = os.path.join(SOURCE_ROOT, dirlist_arr.pop()).replace('\\','/') # replace dashes is for win based file system 
    if os.path.isdir(item_path): 
     if not item_path in sys.path: 
      sys.path.insert(0, item_path) # we use insert to take precedence over any global paths - minimises import conflict suprises 
     logger.debug("Path '%s' added." % item_path) 
Cuestiones relacionadas