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

126

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

$ mkdir myproject
$ cd myproject
$ virtualenv env

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

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

$ mv myproject/ project/

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

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

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

  • 1
    Этот вопрос старый и уже имеет ответ, но я должен задаться вопросом, почему ОП не может просто переместить virtualenv туда, где он был? Очевидно, это не решает желание переместить / переименовать, но разве это не восстановит работоспособность virtualenv, или это уже безнадежно сломано?
  • 1
    Да, вы правы, это восстановит виртуальную среду, но не решит проблему.
Теги:
pip
virtualenv

7 ответов

127
Лучший ответ

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

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

$virtualenv --relocatable ENV

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

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

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

  • 1
    Работал как шарм, спасибо.
  • 2
    предостережение: изменение env на relocatable делает больше, чем просто позволяет вам переместить папку. (см. Примечание: скопировано из документации) ... это может иметь побочные эффекты.
Показать ещё 4 комментария
78

Я считаю, что "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 в глобальную среду системы, а ваш virtualenv pip правильно создан.

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

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

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

  • изменить /tmp/project/env/bin/pip в Line 1

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

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

  • 0
    отлично работает для меня, спасибо!
  • 4
    Если необходимо вручную изменить пути, следует отметить, что существует более двух жестко закодированных файлов. Найти их все с помощью чего-то вроде: grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name . Фактически, я заметил, что в одном из моих экземпляров Django многие пакеты содержали «путь к Python sh-bang».
Показать ещё 5 комментариев
26

ПРИМЕЧАНИЕ: Как @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
  • 6
    Для некоторых людей pip install -r requirements.txt занимает пару часов (компиляция сторонних C-расширений на raspberry pi).
  • 3
    Возможно, это правда, но мне кажется, что это крайний случай. Я все еще думаю, что это может быть жизнеспособным решением для многих случаев.
Показать ещё 5 комментариев
22

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

pip install virtualenvwrapper

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

cpvirtualenv oldenv newenv

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

rmvirtualenv oldenv

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

workon newenv
  • 0
    Ответ Афвича действительно должен быть принятым методом.
  • 0
    Это работает, только если вы используете virtualenvwrapper , а не просто virtualenv . Этот ответ от @ryankdwyer лучше.
Показать ещё 3 комментария
10

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

  • переименуйте каталог
  • повторить это: $ virtualenv ..\path\renamed_directory
  • virtualenv исправит ассоциации каталогов, оставив ваши пакеты на месте
  • $ scripts/activate
  • $ pip freeze, чтобы проверить, что ваши пакеты находятся на месте.
  • Важное предупреждение, если у вас есть какие-либо статические зависимости пути в файлах script в вашем каталоге virtualenv, вам придется вручную их изменить.
  • 0
    Это было очень хорошее решение для меня. Так как это решение может избежать некоторых проблем, связанных с --relocatable , я думаю, что это решение лучше, чем принятый ответ. До сих пор я заметил, что многие файлы .pyc в _new_name_/lib/python2.7 прежнему ссылаются на _old_name_ . Однако, похоже, это не влияет на то, как работает моя среда. Возможно, единственное лучшее решение - это использование virtualenvwrapper или некоторых других утилит, упомянутых здесь в ответах. По крайней мере, это решение не требует установки дополнительных программ.
  • 0
    Работает как шарм!
8

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

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
  • 0
    Лучший ответ !!!
  • 0
    Это должно быть помечено как лучший ответ. Руки вниз! Клонирование заняло некоторое время, так что наберитесь терпения, ребята.
1

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

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

Например:

virtualenv-mv myproject project

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню