Могу ли я переместить virtualenv?
Этот вопрос не является дубликатом.
Это относится не только к переименованию виртуальной среды, но и к ее фактическому перемещению в другой каталог, в том числе, возможно, в каталог другого пользователя.
Это не то же самое, что просто переименование виртуальной среды, особенно для людей, незнакомых с virtualenvs.
Если я создаю virtualenv и перемещаю его в другую папку, он все равно будет работать?
$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $
... позже в тот же день виртуальная среда MOVED...
(my-python-venv) $ deactivate
$ mkdir -p /home/me/PeskyPartyPEnvs
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/
Вопрос:
Будет ли это работать?
$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas
Я имею в виду это как вопрос о мудрости попытки этого (если, конечно, эта мудрость не смешная, конечно) и больше о том, возможно ли это. Я действительно хочу знать, возможно ли это сделать в Python 3, или я просто должен смириться с этим и клонировать его.
Могу я просто mv
virtualenv
как без грусти? Я хочу избежать грусти.
11 ответов
//, НО УВЫ:
Нет, ты не можешь просто mv
, Есть обходные пути, но может быть проще переустановить.
(my-python-venv)$ /home/me/PeskyPartyPEnvs/pip3 install foaas
zsh: /home/me/PeskyPartyPEnvs/pip3: bad interpreter: /home/me/Env/my-python-venv/bin/python3: no such file or directory
(my-python-venv)$ deactivate
$
... прессы enter
много разочарований, и следующие работы
$
$
$ pip3 search foaas
За исключением того, что это не из my-python-venv
эрго грусть
Хочу mv
ваш virtualenv
и использовать его, иначе немодифицированный?
Короткий ответ:
Ну, я не могу.
Да. Можно перемещать его на той же платформе. Ты можешь использовать --relocatable
в существующей среде.
От --help
:
--relocatable - сделать существующую среду virtualenv перемещаемой. Это исправляет сценарии и делает все файлы.pth относительными.
ОДНАКО, это, кажется, не меняет activate
сценарий, а точнее только меняет pip*
а также easy_install*
скрипты. в activate
сценарий $VIRTUAL_ENV
переменная среды жестко закодирована как оригинал /path/to/original/venv
, $VIRTUAL_ENV
переменная используется для установки PATH
вашей активной среды тоже, поэтому она должна быть изменена в зависимости от нового местоположения для вызова python
а также pip
и т.д. без абсолютного пути.
Чтобы исправить эту проблему, вы можете изменить $VIRTUAL_ENV
переменная среды в activate
скрипт (например, используя sed
) и все должно быть хорошо, чтобы идти.
Пример использования:
$ cd ~/first
$ virtualenv my-venv
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV="/home/username/first/my-venv"
$ virtualenv --relocatable my-venv
Making script my-venv/bin/easy_install relative
Making script my-venv/bin/easy_install-2.7 relative
Making script my-venv/bin/pip relative
Making script my-venv/bin/pip2 relative
Making script my-venv/bin/pip2.7 relative
### Note that `activate` has not been touched
$ mkdir ~/second
$ mv my-venv ~/second
$ cd ~/second
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV=/home/username/first/my-venv
### (This variable hasn't been changed, it still refers to the old, now non-existent directory!)
$ sed -i -e 's|username/first|username/second|' my-venv/bin/activate
## sed can be used to change the path.
## Note that the `-i` (in place) flag won't work on all machines.
$ source my-venv/bin/activate
(my-venv) $ pip install foass
...
(my-venv) $ python
[...]
> import foass
Ура, теперь вы можете устанавливать вещи и загружать их в новую виртуальную среду.
Для Python 3.3+ (с новым venv
встроенный модуль)
Краткий ответ (независимо от версии):
- Просто воссоздайте, это просто!!
- Виртуальные среды сложно переместить / переименовать...
Длинный ответ:
Начиная с Python v3.3, virtualenv
стал встроенным модулем с именем venv
.
В --relocatable
вариант, упомянутый в других ответах, не был включен в venv
, и в настоящее время я не знаю хорошего и безопасного способа переименовать или переместить виртуальную среду Python.
Однако есть довольно простой способ просто воссоздать виртуальную среду со всеми ее текущими установленными пакетами. См. Этот ответ о переименовании виртуальной среды. Во время этого процесса вы можете воссоздать новую среду в любом месте и с любым именем. Или посмотрите раздел ниже, чтобы узнать о процессе.
В этом ответе он упоминает несколько других сторонних пакетов, которые могут поддерживать прямое переименование или перемещение. Если вы решили найти способ перенести виртуальную среду без изменений, вы можете проверить, работают ли они сvenv
также.
Примечание. В этом ответе основное внимание уделяетсяvirtualenv
, скорее, чем venv
. См. Ниже, как перевести.
venv
против старшего virtualenv
синтаксис команды
Команда для использования venv
является:
python -m venv
а не просто virtualenv
, который устанавливается как команда в исходном пакете. Где "python" относится к тому, как вы запускаете исполняемый файл python, который может быть разнообразным, например:
python
py
илиpy -3.7
или аналогичный ( Python Launcher для Windows для Python 3.3+ и Windows только на данный момент)python3
(соглашение для сред Linux, в которых устанавливаются два Python 2 и 3)- Если у вас возникли проблемы, используйте абсолютный путь к исполняемому файлу python, который вы хотите запустить: например,
c:\program files\python37\python.exe
Если вы не уверены, какая версия запущена, вы всегда можете python --version
выяснить.
Как воссоздать виртуальную среду
Создать / воссоздать виртуальную среду легко и должно стать вашей второй натурой после того, как вы немного поработаете с ними. Этот процесс отражает то, что вы сделали бы для распространения вашего скрипта в виде пакета (с его зависимостями) в первой половине, а затем то, что кто-то сделает, чтобы установить ваш скрипт / пакет для дальнейшей разработки.
Сначала получите обновленный список того, что находится в виртуальной среде. Когда он активен, получите версию Python, которую он использует, и сохраните список зависимостей в файл.
Использовать
python --version
с активированной виртуальной средой, чтобы узнать, какую версию Python она использует.- Это для ясности - вы можете обновить версию Python по разным причинам - по крайней мере, до последней версии патча.
- Например, если существующий venv использует Python v3.7.4, но теперь v3.7.6 отсутствует - используйте вместо него v3.7.6, который должен включать только постоянную безопасность и исправления ошибок.
Использовать
python -m pip freeze > requirements.txt
создать список текущих зависимостей пакетов и поместить их вrequirements.txt
файл. Эта команда наверняка работает в Linux или Git Bash - не на 100% уверена в Powershell или командной строке в Windows.
Теперь создайте новую виртуальную среду, а затем добавьте зависимости от старой.
Сделайте свой новый Venv.
- Убедитесь, что вы используете правильную версию python, которую хотите установить на venv.
- Если вы хотите, чтобы это была точно такая же версия Python:
- Запустите python прямо из текущей виртуальной среды (с активированной) и просто используйте
python
как команда - Или используйте абсолютный путь с
python.exe
в папке виртуальной среды
- Запустите python прямо из текущей виртуальной среды (с активированной) и просто используйте
- Для новой записи папки venv в команде:
- Либо добавьте абсолютный, либо относительный путь к желаемой конечной папке.
- Использовать
python -m venv my_new_venv
для создания новой виртуальной среды в текущем рабочем каталоге в новомmy_new_venv
папка. - Имя папки venv будет именем venv (то, что отображается в приглашении, когда оно активировано).
Установите свои зависимости из
requirements.txt
файл.python -m pip install -r requirements.txt
Возможно, вам потребуется переустановить локальные пакеты, находящиеся в режиме разработки.
Обратите внимание: если вам когда-нибудь понадобится увидеть конкретное место, в которое установлен пакет, используйте:
python -m pip list -v
- В
-v
или опция "подробный" добавит некоторую дополнительную информацию о каждом установленном пакете, включая путь, по которому он установлен. Это полезно, чтобы убедиться, что вы правильно поддерживаете виртуальные, пользовательские и системные установленные пакеты.
На этом этапе вы можете просто удалить старую папку venv и все содержимое. Я рекомендую использовать для этого графический интерфейс - удаление файлов из командной строки Linux часто происходит навсегда, и небольшая опечатка может быть плохой новостью.
--relocatable
аргумент virtualenv
appears to allow you to do this.
ДА, ТЫ МОЖЕШЬ!(В
windows
)
Обходной путь прост: просто переместите виртуальную среду куда угодно и отредактируйте
activate.bat
внутри
scripts\
:
Перейдите в виртуальную среду в нужный каталог
Щелкните правой кнопкой мыши и отредактируйте
activate.bat
расположен вvenv_folder\scripts
.+ Изменить
VIRTUAL_ENV
переменная из:set VIRTUAL_ENV=C:\old_directory\venv_name
в
set VIRTUAL_ENV=C:\new_directory\venv_name
Сохраните отредактированный командный файл, и все!
ПРИМЕЧАНИЕ. Мое решение должно работать и сохранять
windows users
настройка новых виртуальных сред, я сомневаюсь, что это будет работать в другой операционной системе, так как
.bat
из
MS-DOS
Да, это должно быть возможно, если вы не сделали ничего, что зависит от текущего каталога virtualenv.
Однако, если у вас есть выбор, лучше всего создать новый virtualenv и вместо этого начать использовать новый virtualenv. Это самый безопасный выбор, который может вызвать проблемы позже.
В документации упоминается, что:
Каждый virtualenv имеет жестко запрограммированную информацию о пути,
Например, если вы запустили setvirtualenvproject
тогда он не сможет переключиться на нужный каталог после запуска workon ...
так что в этом случае вам нужно будет исправить это вручную.
В общем, virtualenv - это чуть больше, чем каталог с необходимыми файлами интерпретатора Python и пакетами, которые вам нужны.
Используя ответы этого и других потоков на аналогичную тему, я создал сценарий bash, который, расположенный и выполняемый в самом каталоге virtualenv, поможет с вашими перемещениями virtualenv.
После выполнения virtualenv --relocatable yourenv
вам нужно будет изменить свой VIRTUAL_ENV
переменную каждый раз, когда вы перемещаете каталог, поэтому, если вы не хотите изменять ее вручную, используйте this.
#!/bin/bash \n
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
EXISTING=$(grep 'VIRTUAL_ENV=' bin/activate)
NEWDIR=VIRTUAL_ENV=\"$DIR\"
sed -i -e "s|$EXISTING|$NEWDIR|" bin/activate
source bin/activate
Я надеюсь, что это помогает.
Я написал сценарий venv-move .
Первый аргумент - это путь к вену. Удаляет любые
__pycache__
под этим путем.
Он обнаруживает старый путь и заменяет его текущим путем после подтверждения. Кажется, все работает нормально, даже при переходе на другую машину того же типа.
Было бы разумно переписать это на Python, но программа была бы длиннее.
#!/bin/bash -eu
venv=$1
old=`perl -ne '/VIRTUAL_ENV="(.*?)"/ && print "$1\n"' "$venv/bin/activate"`
new=$PWD/$venv
find "$venv" -name __pycache__ | xargs rm -rf --
files=`fgrep -r "$old" "$venv" -l`
echo "replace $old with $new in:"
echo "$files"
read -p "[yn] ? " YN
[ "$YN" = y ]
sed -i "s:$old:$new:g" $files
TL;DR
входит в состав virtualenvwrapper
virtualenv-clone /path/to/old/venv /path/to/new/venv
Альтернативно
Вы также можете попробовать
cpvirtualenv
cpvirtualenv /path/to/old/venv /path/to/new/venv
Но cpvirtualenv ожидает
/path/to/old/venv
существовать внутри
$WORKON_HOME
а если это не так, он терпит неудачу. Поскольку это вызывает
virtualenv-clone
вы также можете использовать это вместо этого; чтобы избежать ошибок вроде
mark@Desktop:~/venvs$ cpvirtualenv ./random/ $WORKON_HOME/random
Copying random as /home/mark/.virtualenvs/venvs/random...
Usage: virtualenv-clone [options] /path/to/existing/venv /path/to/cloned/venv
virtualenv-clone: error: src dir '/home/mark/.virtualenvs/venvs/random' does not exist
Предупреждение согласно документации virtualenvwrapper
Копирование виртуальных сред не поддерживается. Каждый virtualenv имеет информацию о пути, жестко закодированную в нем, и могут быть случаи, когда код копирования не знает, что ему нужно обновить конкретный файл. Используйте с осторожностью.
Что он на самом деле делает? Согласно virtualenv-клон PyPi страницы
Скрипт для клонирования не перемещаемого файла virtualenv.
Virtualenv предоставляет способ сделать виртуальный объект перемещаемым, который затем можно было бы скопировать, как мы хотели. Однако создание перемещаемого virtualenv таким образом нарушает изоляцию virtualenv без пакетов, а также другие аспекты, которые связаны с относительными путями и / usr / bin / env shebang, что может быть нежелательным.
Кроме того, перезапись .pth и .egg-link не работает должным образом. Это попытка преодолеть эти проблемы и предоставить способ легко клонировать существующий файл virtualenv.
Он выполняет следующее:
копирует каталог sys.argv [1] в sys.argv [2]
обновляет жестко запрограммированную переменную VIRTUAL_ENV в сценарии активации в новое расположение репо. (--relocatable этого не касается)
обновляет shebangs различных скриптов в bin на новый Python, если они указывали на старый Python. (нумерация версий сохраняется.)
он также может изменить / usr / bin / env python shebangs, чтобы они были абсолютными, хотя эта функция в настоящее время не предоставляется.
проверяет sys.path клонированного virtualenv, и если какой-либо из путей взят из старой среды, он находит любые файлы ссылок .pth или .egg в sys.path, расположенные в новой среде, и проверяет, что все абсолютные пути к старой среде обновлены в новую среду.
наконец, он снова дважды проверяет sys.path и завершится ошибкой, если все еще есть пути из старой среды.
ПРИМЕЧАНИЕ. Для этого скрипта требуется Python 2.7 или 3.4+.
Как уже говорилось, есть способы сделать это. Лучшим инструментом на данный момент должен быть venv-pack. Для этого достаточно одной команды, которая выполняет тяжелую работу по удалению жестко закодированныхVIRTUAL_ENV
переменная, поэтому после упаковки venv можно поместить куда угодно, и он все равно будет работать.
Мой ответ - можно
Недавно нам пришлось удалить некоторых пользователей на наших серверах, но у некоторых из них был устаревший код. Я знал это, поэтому переместил все данные в какой-то новый каталог. Настал момент запустить устаревший код, используя устаревшую среду, но, к сожалению, это не сработало.
pip
не сработало, поэтому я не смог аккуратно заморозитьrequirements.txt
, и мне было очень лень устанавливать пакеты один за другим изlib/site-packages
. Поэтому я решил поискать обходной путь.
Обходной путь: я изменил все старые пути к среде вbin/activate*
иbin/pip*
файлы, а также замененыbin/python*
ссылки рефералов (ссылки были битые). После этого это сработало. Не уверен, что все изменения обязательны, но все же эта информация может быть полезна. Надеюсь кому-то поможет (: