Я создал папку и инициализировал в ней экземпляр virtualenv.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Когда я запускаю (env)$ pip freeze
, он показывает установленные пакеты как следует.
Теперь я хочу переименовать myproject/
в project/
.
$ mv myproject/ project/
Тем не менее, теперь, когда я бегу
$ . env/bin/activate
(env)$ pip freeze
он говорит, что пип не установлен. Как переименовать папку проекта, не нарушая окружение?
python
ubuntu
virtualenv
pip
Райли Уоткинс
источник
источник
Ответы:
Вы должны настроить вашу установку, чтобы использовать относительные пути.
virtualenv
предусматривает для этого с--relocatable
опцией. Из документов :источник
grep -EIr '\Wold_venv_name\W' /path/to/new_venv
поможет найти любые шабанги, которые используют старый венв, но не является полной проверкой перемещенного венва..project
файл virtualenvwrapper , который содержит путь к исходному коду, который зависит от virtualenv, при условии, что вы используете virutalenvwrapper и также переименовали dir проекта в соответствии с новым virtualenv.Я верю, что «знать почему» важнее, чем «знать как» . Итак, вот другой подход, чтобы исправить это.
Когда вы запускаете
. env/bin/activate
, он фактически выполняет следующие команды (используя,/tmp
например):Тем не менее, вы только что переименовали
myproject
вproject
, так что команда не смогла выполнить. Вот почему он говоритpip is not installed
, потому что вы не установилиpip
в глобальную среду системы, и ваш virtualenvpip
не правильно поставлен.Если вы хотите исправить это вручную, это способ:
С помощью вашего любимого редактора, такого как Vim, измените
/tmp/project/env/bin/activate
обычно в строке 42:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
Изменить
/tmp/project/env/bin/pip
в строке 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».virtualenv
. Возможно, есть какой-то вариант использования, которым я не пользуюсь, и поэтому не сталкиваюсь с проблемой.virtualenv
. Чтобы решить эту проблему, я отредактировал заголовок bash (как он называется?) Вipython
файле, и тогда он работал нормально.ПРИМЕЧАНИЕ: как @jb. указывает, что это решение применимо только к легко (повторно) создан
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, чтобы сделать вещи немного проще, поскольку все virtualenv хранятся в централизованном месте.
источник
pip install -r requirements.txt
занимает пару часов (сборка сторонних C-расширений на Raspberry Pi).virtualenv env && pip install -r requirements.txt
НЕ установит требования в новой среде, потому что вы не активируете егоvirtualenv-wrapper
самим пользователем (который автоматически активируется при создании). Я обновил свой ответ, чтобы включить активациюvirtualenv
в надежде избежать любой путаницы.Я всегда устанавливаю virtualenvwrapper, чтобы выручить. Из командной строки:
Есть способ, описанный в документах virtualenvwrapper - cpvirtualenv Это то, что вы делаете. Убедитесь, что вы находитесь вне своей среды и вернетесь к приглашению оболочки. Введите это с необходимыми именами:
И затем, если необходимо:
Чтобы перейти к вашему newenv:
источник
virtualenvwrapper
, а не толькоvirtualenv
. Этот ответ от @ryankdwyer лучше.Вы можете исправить вашу проблему, выполнив следующие действия:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
чтобы убедиться, что ваши пакеты на местеисточник
--relocatable
, я думаю, что это решение лучше, чем принятый ответ. До сих пор я заметил, что многие.pyc
файлы_new_name_/lib/python2.7
все еще ссылаются на_old_name_
. Однако это, похоже, не влияет на то, как работает моя среда. Возможно, единственным лучшим решением является использованиеvirtualenvwrapper
или некоторые другие утилиты, упомянутые в ответах здесь. По крайней мере, это решение не требует установки дополнительных программ.Еще один способ сделать это, который работал для меня много раз без проблем, является virtualenv-clone :
источник
(внутри папки проекта)
Не забудьте деактивировать и активировать
источник
sed -i "s|$old_dir|$new_dir|g" bin/*
sed -i '.original' 's/old_dir_name/new_dir_name/g' *
для Максаvirtualenv --relocatable ENV
это не желаемое решение. Я предполагаю, что большинство людей хотят иметь возможность переименовать virtualenv без каких-либо долгосрочных побочных эффектов.Поэтому я создал простой инструмент для этого. Страница проекта для virtualenv-mv описывает ее более подробно, но, по сути, вы можете использовать ее так
virtualenv-mv
же, как если бы вы использовали простую реализациюmv
(без каких-либо опций).Например:
Обратите внимание, однако, что я только что взломал это. Он может сломаться при необычных обстоятельствах (например, символические ссылки virtualenvs), поэтому, пожалуйста, будьте осторожны (сделайте резервную копию того, что вы не можете позволить себе потерять) и дайте мне знать, если у вас возникнут какие-либо проблемы.
источник