reubicable virtualenv – ¿realmente funciona

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

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

Como se indica en la documentación, --relocatable es una opción experimental, por lo que no es sorprendente que tenga dificultades con ella. Dicho esto, ¿recuerdas volver a ejecutar --relocatable después de instalar nuevos paquetes? Si instaló los paquetes desde github con -e , eso podría ser un problema, ya que no se instala en los 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 recrearlos en su lugar (lo que he hecho un par de veces al cambiar entre plataformas).

No, para un ‘–relocatable’ no actualiza el script ‘virtualenv / bin /ctiv’. Sí, puede solucionarlo volviendo a ejecutar la configuración de virtual env como zeekay sugirió, sin embargo, las imágenes fijas no pueden importar ninguna instalación ‘pip -e git …’ que se coloca en ‘virtualenv / src’, por lo que tendrá que volver a ejecutar Esos pip se instalan manualmente.

A medida que adquirí experiencia como desarrollador, ahora evito capas adicionales de dependencia y abstracción que solo tienden a ser puntos de falla.

Así que ahora no instalo con pip editable (-e) y, si es necesario, clone los repositorys manualmente en ‘project / src /’ en lugar de ‘project / virtualenv / src’ y tengo el siguiente script auto_prep_pythonpath.py cargado antes de lanzar mi proyecto (lo django.wsgi en mi script django.wsgi ).

Como nota al margen, agrego ‘a la medida’ a cualquier paquete colocado en ‘proyecto / src’ que se modifique / piratee para que así no tenga que preocuparme por la compatibilidad con versiones anteriores y rastree todas las fonts bajo control de código, ya que los repositorys en línea pueden y te frenará.

Espero que esto ayude.

 """ Prepares python path to include additional project/src/ 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 somewhere 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 PYTHONPATH.") 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 - minimizes import conflict surprises logger.debug("Path '%s' added." % item_path)