Могу ли я переместить 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, который может быть разнообразным, например:

  1. python
  2. py или py -3.7или аналогичный ( Python Launcher для Windows для Python 3.3+ и Windows только на данный момент)
  3. python3 (соглашение для сред Linux, в которых устанавливаются два Python 2 и 3)
  4. Если у вас возникли проблемы, используйте абсолютный путь к исполняемому файлу python, который вы хотите запустить: например, c:\program files\python37\python.exe

Если вы не уверены, какая версия запущена, вы всегда можете python --version выяснить.



Как воссоздать виртуальную среду

Создать / воссоздать виртуальную среду легко и должно стать вашей второй натурой после того, как вы немного поработаете с ними. Этот процесс отражает то, что вы сделали бы для распространения вашего скрипта в виде пакета (с его зависимостями) в первой половине, а затем то, что кто-то сделает, чтобы установить ваш скрипт / пакет для дальнейшей разработки.

Сначала получите обновленный список того, что находится в виртуальной среде. Когда он активен, получите версию Python, которую он использует, и сохраните список зависимостей в файл.

  1. Использовать python --version с активированной виртуальной средой, чтобы узнать, какую версию Python она использует.

    • Это для ясности - вы можете обновить версию Python по разным причинам - по крайней мере, до последней версии патча.
    • Например, если существующий venv использует Python v3.7.4, но теперь v3.7.6 отсутствует - используйте вместо него v3.7.6, который должен включать только постоянную безопасность и исправления ошибок.
  2. Использовать python -m pip freeze > requirements.txt создать список текущих зависимостей пакетов и поместить их в requirements.txtфайл. Эта команда наверняка работает в Linux или Git Bash - не на 100% уверена в Powershell или командной строке в Windows.

Теперь создайте новую виртуальную среду, а затем добавьте зависимости от старой.

  1. Сделайте свой новый Venv.

    • Убедитесь, что вы используете правильную версию python, которую хотите установить на venv.
    • Если вы хотите, чтобы это была точно такая же версия Python:
      • Запустите python прямо из текущей виртуальной среды (с активированной) и просто используйте python как команда
      • Или используйте абсолютный путь с python.exe в папке виртуальной среды
    • Для новой записи папки venv в команде:
      • Либо добавьте абсолютный, либо относительный путь к желаемой конечной папке.
      • Использовать python -m venv my_new_venv для создания новой виртуальной среды в текущем рабочем каталоге в новом my_new_venv папка.
      • Имя папки venv будет именем venv (то, что отображается в приглашении, когда оно активировано).
  2. Установите свои зависимости из 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\:

  1. Перейдите в виртуальную среду в нужный каталог

  2. Щелкните правой кнопкой мыши и отредактируйте activate.bat расположен в venv_folder\scripts.

  3. + Изменить VIRTUAL_ENV переменная из:

     set VIRTUAL_ENV=C:\old_directory\venv_name
    

    в

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
  4. Сохраните отредактированный командный файл, и все!

ПРИМЕЧАНИЕ. Мое решение должно работать и сохранять 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*ссылки рефералов (ссылки были битые). После этого это сработало. Не уверен, что все изменения обязательны, но все же эта информация может быть полезна. Надеюсь кому-то поможет (:

Другие вопросы по тегам