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?

Author: Riley Watkins, 2011-07-08

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.

 132
Author: ire_and_curses,
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:

  1. Modificar /tmp/project/env/bin/activate con su editor favorito como Vim, por lo general en Line 42

    VIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. Modifíquese /tmp/project/env/bin/pip en Line 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.

 88
Author: holys,
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 virtualenvs 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, marque env/lib/pythonX.X/site-packages antes de eliminar el env original.
  • Suprímase el (env)

    deactivate && rm -rf env

  • Cree un nuevo virtualenv, actívelo e instale los requisitos

    virtualenv 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
 32
Author: bnjmn,
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
 26
Author: Afrowave,
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:

  1. cambie el nombre de su directorio
  2. vuelve a ejecutar esto: $ virtualenv ..\path\renamed_directory
  3. virtualenv corregirá las asociaciones de directorios mientras deja sus paquetes en su lugar
  4. $ scripts/activate
  5. $ pip freeze para verificar que sus paquetes están en su lugar
  6. Una advertencia importante, si tiene dependencias de rutas estáticas en archivos de script en su directorio virtualenv, tendrá que cambiarlas manualmente.
 13
Author: ryankdwyer,
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
 8
Author: Antony Hatchkins,
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

 3
Author: Ignacio,
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.

 1
Author: Six,
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