Переименование папки virtualenv, не нарушая ее - PullRequest
156 голосов
/ 08 июля 2011

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

$ mkdir myproject
$ cd myproject
$ virtualenv env

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

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

$ mv myproject/ project/

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

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

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

Ответы [ 8 ]

140 голосов
/ 08 июля 2011

Вам необходимо настроить вашу установку, чтобы использовать относительные пути.virtualenv предусматривает это с помощью опции --relocatable.Начиная с документы :

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

$ virtualenv --relocatable ENV

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

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

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

103 голосов
/ 22 мая 2013

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

Когда вы запускаете . 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 снова вернулся.

35 голосов
/ 28 октября 2013

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


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

$(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
28 голосов
/ 30 декабря 2015

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

pip install virtualenvwrapper

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

cpvirtualenv oldenv newenv

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

rmvirtualenv oldenv

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

workon newenv
15 голосов
/ 07 апреля 2015

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

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

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

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
4 голосов
/ 03 апреля 2018

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

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

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

1 голос
/ 27 сентября 2015

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

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

Например:

virtualenv-mv myproject project

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

...