Renombrar una carpeta virtualenv sin romperla
He creado una carpeta e inicializado una instancia de virtualenv en ella.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Cuando corro (env)$ pip freeze
, muestra los paquetes instalados como debería.
Ahora quiero cambiar el nombre de 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?
8 answers
Necesita ajustar su instalación para usar rutas relativas. virtualenv
proporciona esto con la opción --relocatable
. De los documentos :
Normalmente los entornos están vinculados a una camino específico. Eso significa que usted no puede mover un entorno o cópialo a otro ordenador. Puedes arreglar un entorno para hacerlo reubicable con el comando:
Virtu virtualenv ENV relocatable ENV
NOTA: ENV es el nombre del entorno virtual y debe ejecutar esto desde fuera del directorio ENV.
Esto hará que algunos de los archivos creado por setuptools o distribuir usar rutas relativas, y cambiará todos los scripts a usar activate_this.py en lugar de utilizar el ubicación del intérprete de Python a seleccione el entorno.
Nota: debe ejecutar esto después de haber instalado cualquier paquete en el ambiente. Si usted hace un entorno reubicable, luego instale un nuevo paquete, debe ejecutar virtualenv -- reubicable de nuevo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-14 10:33:37
Lo que creo es que "knowing why" matters more than "knowing how"
. Por lo tanto, aquí hay otro enfoque para solucionar esto.
Cuando corras:
$ . env/bin/activate
En realidad ejecuta los siguientes comandos:
(Pruebo esto en /tmp
)
VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV
Sin embargo, acaba de cambiar el nombre de myproject
a project
, por lo que ese comando no se pudo ejecutar.
Es por eso que dice pip is not installed
, porque ni ha instalado pip
en el entorno global del sistema ni su virtualenv pip
se obtiene correctamente.
Si quiere arreglar esto manualmente, esa es la manera:
-
Modificar
/tmp/project/env/bin/activate
con su editor favorito como Vim, por lo general enLine 42
VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
-
Modifíquese
/tmp/project/env/bin/pip
enLine 1
#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
Después de eso, active su entorno virtual env
de nuevo, y verá que su pip
ha vuelto de nuevo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 13:14:14
NOTA: Como @jb. señala que esta solución solo se aplica a virtualenv
s fácilmente (re)creados. Si un entorno tarda varias horas en instalar esta solución no se recomienda
Los Virtualenvs 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
file(env)$ pip freeze > requirements.txt
- Si no puede crear el archivo
requirements.txt
, marqueenv/lib/pythonX.X/site-packages
antes de eliminar elenv
original.
- Si no puede crear el archivo
-
Suprímase el
(env)
deactivate && rm -rf env
-
Cree un nuevo
virtualenv
, actívelo e instale los 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 virtualenvs se mantienen en una ubicación centralizada
$(old-venv) pip freeze > temp-reqs.txt
$(old-venv) deactivate
$ mkvirtualenv new-venv
$(new-venv) pip install -r temp-reqs.txt
$(new-venv) rmvirtualenv old-venv
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-19 09:19:52
Siempre instalo virtualenvwrapper para ayudar. Desde el indicador de shell:
pip install virtualenvwrapper
Hay una forma documentada en los documentos virtualenvwrapper - cpvirtualenv Esto es lo que haces. Asegúrese de que está fuera de su entorno y vuelva a la línea de comandos de shell. Escriba esto con los nombres requeridos:
cpvirtualenv oldenv newenv
Y luego, si es necesario:
rmvirtualenv oldenv
Para ir a su newenv:
workon newenv
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-29 14:05:51
Puede solucionar su problema siguiendo estos pasos:
- cambie el nombre de su directorio
- vuelve a ejecutar esto:
$ virtualenv ..\path\renamed_directory
- virtualenv corregirá las asociaciones de directorios mientras deja sus paquetes en su lugar
$ scripts/activate
-
$ pip freeze
para verificar que sus paquetes están en su lugar - Una advertencia importante, si tiene dependencias de rutas estáticas en archivos de script en su directorio virtualenv, tendrá que cambiarlas manualmente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-07 01:57:37
Otra forma de hacerlo que funcionó para mí muchas veces sin problemas es virtualenv-clone :
pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 11:09:06
(dentro de la carpeta del proyecto)
cd bin
sed -i 's/old_dir_name/new_dir_name/g' *
No olvides desactivar y activar
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-03 14:35:21
virtualenv --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 sencilla para hacer precisamente eso. La página del proyecto para virtualenv-mv lo describe con un poco más de detalle, pero esencialmente puede usar virtualenv-mv
al igual que usaría una implementación simple de mv
(sin ninguna opción).
Por ejemplo:
virtualenv-mv myproject project
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 hágamelo saber si encuentra algún problema.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-29 14:55:21