Я создал папку и инициализировал экземпляр virtualenv.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Когда я запускаю (env)$ pip freeze
, он показывает установленные пакеты как следует.
Теперь я хочу переименовать myproject/
в project/
.
$ mv myproject/ project/
Однако теперь, когда я запускаю
$ . env/bin/activate
(env)$ pip freeze
он говорит, что пип не установлен. Как переименовать папку проекта, не нарушая среды?
Вам нужно настроить свою установку для использования относительных путей. virtualenv
предоставляет для этого параметр --relocatable
. Из документы:
Обычно среды привязаны к конкретный путь. Это означает, что вы не может перемещать окружающую среду или скопируйте его на другой компьютер. Ты можешь исправить среду, чтобы сделать это перемещается с помощью команды:
$virtualenv --relocatable 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
в глобальную среду системы, а ваш 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
вернулся снова.
grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name
. Фактически, я заметил, что в одном из моих экземпляров Django многие пакеты содержали «путь к Python sh-bang».
ПРИМЕЧАНИЕ: Как @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
pip install -r requirements.txt
занимает пару часов (компиляция сторонних C-расширений на raspberry pi).
Я всегда устанавливаю virtualenvwrapper, чтобы помочь. В командной строке оболочки:
pip install virtualenvwrapper
В документах virtualenvwrapper есть способ документирования - cpvirtualenv Это то что ты делаешь. Убедитесь, что вы находитесь вне среды и обратно в приглашение оболочки. Введите это с требуемыми именами:
cpvirtualenv oldenv newenv
И затем, при необходимости:
rmvirtualenv oldenv
Чтобы перейти к вашему новшеству:
workon newenv
virtualenvwrapper
, а не просто virtualenv
. Этот ответ от @ryankdwyer лучше.
Вы можете исправить свою проблему, выполнив следующие шаги:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
, чтобы проверить, что ваши пакеты находятся на месте.--relocatable
, я думаю, что это решение лучше, чем принятый ответ. До сих пор я заметил, что многие файлы .pyc
в _new_name_/lib/python2.7
прежнему ссылаются на _old_name_
. Однако, похоже, это не влияет на то, как работает моя среда. Возможно, единственное лучшее решение - это использование virtualenvwrapper
или некоторых других утилит, упомянутых здесь в ответах. По крайней мере, это решение не требует установки дополнительных программ.
Еще один способ сделать это, который работал у меня много раз без проблем, - virtualenv-clone:
pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
virtualenv --relocatable ENV
не является желательным решением. Я предполагаю, что большинство людей хотят переименовать virtualenv без каких-либо долгосрочных побочных эффектов.
Итак, я создал простой инструмент для этого. Страница проекта для virtualenv-mv описывает это немного подробнее, но по существу вы можете использовать virtualenv-mv
только например, вы использовали бы простую реализацию mv
(без каких-либо опций).
Например:
virtualenv-mv myproject project
Обратите внимание, что я только что взломал это. Это может сломаться при необычных обстоятельствах (например, symlinked virtualenvs), поэтому будьте осторожны (создайте резервную копию того, что вы не можете потерять) и сообщите мне, если у вас возникнут какие-либо проблемы.