Переименование папки virtualenv без ее нарушения

Я создал папку и инициализировал экземпляр virtualenv в ней.

$ mkdir myproject
$ cd myproject
$ virtualenv env

когда я запускаю (env)$ pip freeze, он показывает установленные пакеты так, как должен.

теперь я хочу переименовать myproject/ до project/.

$ mv myproject/ project/

однако теперь, когда я бегу

$ . env/bin/activate
(env)$ pip freeze

он говорит, что pip не установлен. Как переименовать папку проекта, не нарушая экологию?

8 ответов


вам нужно настроить установку для использования относительных путей. virtualenv обеспечивает это с помощью . От документы:

обычно среды привязаны к a конкретный путь. Это значит, что ты не удается переместить среду вокруг или скопировать его на другой компьютер. Вы можете исправьте среду, чтобы сделать это перемещается с помощью команды:

$ virtualenv --перемещаемый ENV

Примечание: ENV имя виртуальной среды, и вы должны запустить его из-за пределов каталога ENV.

это сделает некоторые из файлов создано setuptools или распространять используйте относительные пути и изменится все сценарии для использования activate_this.py вместо использования расположение интерпретатора Python для выберите среду.

Примечание: Вы должны запустить это после того, как установлены любые пакеты в окружающая среда. Если вы сделаете окружающая среда перемещаемый, затем установить новый пакет, вы должны запустить virtualenv -- снова перемещается.


Я верю, что это "knowing why" matters more than "knowing how". Итак, вот еще один подход, чтобы исправить это.

при запуске:

$ . env/bin/activate

он фактически выполняет следующие команды:

(Я проверяю это в /tmp )

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV

однако вы только что переименовали myproject до project, так что эта команда не удалось выполнить. Вот почему он говорит pip is not installed, потому что ни вы не установили pip в глобальной среде системы ни ваш виртуальное окружение pip правильно поступает.

если вы хотите исправить это вручную, то это путь:

  1. изменить /tmp/project/env/bin/activate С вашим любимым редактором, как Vim, обычно в Line 42

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

  2. изменить /tmp/project/env/bin/pip на Line 1

    #!/tmp/myproject/env/bin/python =>#!/tmp/project/env/bin/python

после этого активируйте виртуальную среду env еще раз, и вы будете смотрите ваш pip снова вернулась.


Примечание: As @jb. указывает, что это решение применимо только к легко (re)созданному virtualenvы. Если среда занимает несколько часов, чтобы установить это решение не рекомендуется


Virtualenvs велики, потому что их легко сделать и переключаться; они не позволяют вам заблокироваться в одной конфигурации. Если вы знаете требования проекта или можете их получить, сделать новую virtualenv:

  • создать

    (env)$ pip freeze > requirements.txt

    • если вы не можете создать , Регистрация env/lib/pythonX.X/site-packages перед удалением исходного env.
  • удалить существующий (env)

    deactivate && rm -rf env

  • создать новый virtualenv, активируйте его и установите требования

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


кроме того, используйте virtualenvwrapper, чтобы сделать вещи немного проще, поскольку все virtualenvs хранятся в централизованном месте

$(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

Я всегда устанавливаю virtualenvwrapper, чтобы помочь. Из командной строки:

pip install virtualenvwrapper

есть способ, задокументированный в документах virtualenvwrapper -cpvirtualenv Это то, что ты делаешь. Убедитесь, что вы вышли из среды и вернулись к командной строке. Введите это с требуемыми именами:

cpvirtualenv oldenv newenv

а потом, при необходимости:

rmvirtualenv oldenv

чтобы перейти к newenv:

workon newenv

вы можете исправить свою проблему, выполнив следующие шаги:

  1. переименуйте каталог
  2. повтор этого: $ virtualenv ..\path\renamed_directory
  3. virtualenv исправит ассоциации каталогов, оставляя пакеты на месте
  4. $ scripts/activate
  5. $ pip freeze чтобы убедиться, что ваши пакеты на месте
  6. важное предостережение, если у вас есть какие-либо статические зависимости пути в файлах скриптов в каталоге virtualenv, вам придется вручную изменить те.

еще один способ сделать это, который работал для меня много раз без проблем, это virtualenv-clone:

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env

(внутри папки проекта)

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

Не забудьте деактивировать и активировать


virtualenv --relocatable ENV не является желательным решением. Я предполагаю, что большинство людей хотят иметь возможность переименовать virtualenv без любые долгосрочные побочные эффекты.

поэтому я создал простой инструмент для этого. Страница проекта virtualenv-mv описывает его немного более подробно, но по существу вы можете использовать virtualenv-mv так же, как вы использовали бы простую реализацию mv (без вариантов).

для пример:

virtualenv-mv myproject project

обратите внимание, однако, что я только что взломал это. Он может сломаться при необычных обстоятельствах (например, symlinked virtualenvs), поэтому, пожалуйста, будьте осторожны (резервное копирование того, что вы не можете позволить себе потерять) и дайте мне знать, если у вас возникнут какие-либо проблемы.