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

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

$ mkdir myproject
$ cd myproject
$ virtualenv env

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

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

$ mv myproject/ project/

Однако теперь, когда я запускаю

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

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

Ответ 1

Вам нужно настроить свою установку для использования относительных путей. virtualenv предоставляет для этого параметр --relocatable. Из документы:

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

$virtualenv --relocatable ENV

ПРИМЕЧАНИЕ. ENV - это имя виртуальной среды, и вы должны запускать ее извне каталога ENV.

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

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

Ответ 2

Я верю, что "знать почему" важнее, чем "знать как". Итак, вот другой подход, чтобы исправить это.

Когда ты бежишь . env/bin/activate . env/bin/activate, фактически он выполняет следующие команды (например, с помощью /tmp):

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

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

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

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

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

  2. Измените /tmp/project/env/bin/pip в строке 1:

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

После этого активировать виртуальную среду env снова, и вы увидите ваш pip вернулся снова.

Ответ 3

ПРИМЕЧАНИЕ: Как @jb. указывает, что это решение применимо только к легко созданному (re) созданному virtualenv s. Если для установки требуется несколько часов, это решение не рекомендуется


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

  • Создайте файл requirements.txt

    (env)$ pip freeze > requirements.txt

    • Если вы не можете создать файл 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, чтобы сделать вещи немного проще, так как все виртуальные виртуальные машины хранятся в централизованном месте

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

Ответ 4

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

pip install virtualenvwrapper

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

cpvirtualenv oldenv newenv

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

rmvirtualenv oldenv

Чтобы перейти к вашему новшеству:

workon newenv

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Например:

virtualenv-mv myproject project

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