He creado una carpeta e inicializado una instancia virtualenv en ella.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Cuando ejecuto (env)$ pip freeze
, muestra los paquetes instalados como debería.
Ahora quiero cambiar el nombre myproject/
a project/
.
$ mv myproject/ project/
Sin embargo, ahora cuando corro
$ . env/bin/activate
(env)$ pip freeze
dice que pip no está instalado. ¿Cómo cambio el nombre de la carpeta del proyecto sin romper el entorno?
python
ubuntu
virtualenv
pip
Riley Watkins
fuente
fuente
Respuestas:
Debe ajustar su instalación para usar rutas relativas.
virtualenv
proporciona para esto con la--relocatable
opción. De los documentos :fuente
grep -EIr '\Wold_venv_name\W' /path/to/new_venv
ayudará a encontrar cualquier shabangs que usen el antiguo venv, pero no es una verificación completa del venv reubicado..project
archivo virtualenvwrapper , que contiene la ruta al código fuente que depende de virtualenv, suponiendo que está usando virutalenvwrapper y también ha cambiado el nombre del directorio del proyecto para que coincida con el nuevo virtualenv.Creo que "saber por qué" es más importante que "saber cómo" . Entonces, aquí hay otro enfoque para solucionar esto.
Cuando ejecuta
. env/bin/activate
, en realidad ejecuta los siguientes comandos (usando,/tmp
por ejemplo):Sin embargo, sólo ha cambiado el nombre
myproject
aproject
, por lo que no se pudo ejecutar comandos. Es por eso que dicepip is not installed
, porque no ha instaladopip
en el entorno global del sistema y su virtualenvpip
no se obtiene correctamente.Si desea arreglar esto manualmente, esta es la forma:
Con su editor favorito como Vim, modifique
/tmp/project/env/bin/activate
generalmente en la línea 42:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
Modificar
/tmp/project/env/bin/pip
en la línea 1:#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
Después de eso, active su entorno virtual
env
nuevamente y verá quepip
ha vuelto.fuente
grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name
. De hecho, noté que en una de mis instancias de Django, muchos de los paquetes tenían la "ruta al sh-bang de Python".virtualenv
. Quizás haya algún caso de uso que no esté usando y, por lo tanto, no encuentre el problema.virtualenv
. Para resolverlo, edité el encabezado bash (¿cómo se llama?) En elipython
archivo y luego funcionó bien.NOTA: Como @jb. señala, esta solución solo se aplica a s (re) creados fácilmente
virtualenv
. Si un entorno tarda varias horas en instalar esta solución, no se recomiendaVirtualenvs son geniales porque son fáciles de hacer y cambiar; evitan que te bloquees en una sola configuración. Si conoce los requisitos del proyecto, o puede obtenerlos, haga un nuevo
virtualenv
:Crear un
requirements.txt
archivo(env)$ pip freeze > requirements.txt
requirements.txt
archivo, verifiqueenv/lib/pythonX.X/site-packages
antes de eliminar el originalenv
.Eliminar lo existente
(env)
deactivate && rm -rf env
Cree uno nuevo
virtualenv
, actívelo e instale requisitosvirtualenv env && . env/bin/activate && pip install -r requirements.txt
Alternativamente, use virtualenvwrapper para hacer las cosas un poco más fáciles ya que todos los virtualenv se mantienen en una ubicación centralizada
fuente
pip install -r requirements.txt
lleva un par de horas (compilar extensiones C de terceros en raspberry pi).virtualenv env && pip install -r requirements.txt
NO instalará los requisitos en el nuevo entorno porque no lo activavirtualenv-wrapper
yo mismo usuario (que se activa automáticamente en la creación). He actualizado mi respuesta para incluir la activación con lavirtualenv
esperanza de evitar cualquier confusión.Siempre instalo virtualenvwrapper para ayudar. Desde el indicador de shell:
Hay una manera documentada en los documentos de virtualenvwrapper: cpvirtualenv Esto es lo que haces. Asegúrese de estar fuera de su entorno y volver al indicador de shell. Escriba esto con los nombres requeridos:
Y luego, si es necesario:
Para ir a tu newenv:
fuente
virtualenvwrapper
, no solovirtualenv
. Esta respuesta de @ryankdwyer es mejor.Puede solucionar su problema siguiendo estos pasos:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
para verificar que sus paquetes estén en su lugarfuente
--relocatable
, creo que esta solución es mejor que la respuesta aceptada. Hasta ahora, he notado que muchos.pyc
archivos_new_name_/lib/python2.7
todavía se refieren_old_name_
. Sin embargo, eso no parece afectar cómo funciona mi entorno. Quizás la única solución mejor es usarvirtualenvwrapper
o algunas de las otras utilidades mencionadas entre las respuestas aquí. Al menos esta solución no requiere instalar programas adicionales.Otra forma de hacerlo que funcionó para mí muchas veces sin problemas es virtualenv-clone :
fuente
(dentro de la carpeta del proyecto)
No olvides desactivar y activar
fuente
sed -i "s|$old_dir|$new_dir|g" bin/*
sed -i '.original' 's/old_dir_name/new_dir_name/g' *
para Macvirtualenv --relocatable ENV
No es una solución deseable. Supongo que la mayoría de la gente quiere la capacidad de cambiar el nombre de un virtualenv sin efectos secundarios a largo plazo.Así que he creado una herramienta simple para hacer precisamente eso. La página del proyecto para virtualenv-mv lo describe con un poco más de detalle, pero esencialmente puede usarlo
virtualenv-mv
como si fuera una implementación simple demv
(sin ninguna opción).Por ejemplo:
Sin embargo, tenga en cuenta que acabo de hackear esto. Podría romperse en circunstancias inusuales (por ejemplo, virtualenvs con enlaces simbólicos), así que tenga cuidado (haga una copia de seguridad de lo que no puede permitirse perder) y avíseme si encuentra algún problema.
fuente