Могу ли я переместить виртуальный объект?

89

Этот вопрос не повторяется.

Это касается не только переименования виртуальной среды, но и фактического перемещения ее в другой каталог, в том числе, возможно, в каталог другого пользователя.

Это не то же самое, что просто переименование виртуальной среды, особенно для людей, незнакомых с virtualenvs.

Если я создам файл virtualenv и перенесу его в другую папку, он все равно будет работать?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $ 

... позже в тот же день виртуальная среда ПЕРЕМЕЩАЕТСЯ ...

(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, или мне просто нужно высосать и клонировать.

Могу ли я просто как , что без печали? Я действительно хочу избежать печали.mvvirtualenv

Натан Басанезе
источник

Ответы:

69

Да. Его можно перемещать на той же платформе. Вы можете использовать --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

Ура, теперь вы можете устанавливать вещи и загружать их в новую виртуальную среду.

Hilcharge
источник
//, Хм. На самом деле это не делает их перемещаемыми. Я все время получаю ошибку о том, что они не являются «нормальными» файлами сценария.
Натан Басанезе,
7
«Параметр --relocatable в настоящее время имеет ряд проблем, и его работа не гарантируется при любых обстоятельствах. Возможно, что этот параметр будет устаревшим в будущей версии virtualenv. » (
Выделено
1
Я пробовал это в Windows, и в сообщении об ошибке перечислены все сценарии (* .py, * .bat, * .ps1) в Scriptsкаталоге (эквивалентно binon * nix) и говорится что-то вроде activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.того, что в основном он жалуется, что хэш-бэнг в файле Заголовок - это не текущий файл python.exe virtualenv, это тот, который я переместил из -easy fixed. Я заглянул в этот шикарный скрипт, и он все равно обнаруживает свой собственный путь - приятно. Некоторые другие сценарии также не полагаются на пути (например, deactivate.bat), так что, короче говоря, это работает.
Давос
2
@NathanBasanese сообщение activate.ps1 cannot be made relativeможно игнорировать, потому что этот сценарий уже является относительным. Это сообщение бесполезно в Windows, потому что сценарии не используют #!директивы, как в Linux, чтобы сообщить оболочке, какое приложение должно его выполнить. activate.batНе модифицируются, но он не используется (по крайней мере , на окнах 10, вызов activateзапускает скрипт POSH) , поэтому не мне не нужно редактировать скрипты. Проблема в том, pip.exeчто путь к python жестко запрограммирован и требует редактирования с помощью шестнадцатеричного редактора или просто переустановки.
Давос
3
@Sgedda Оглядываясь назад, я бы сказал, не делайте этого. Среды python должны легко воссоздаваться с использованием как минимум pip freezeфайла требований, чтобы вы могли легко переустановить все свои пакеты, докер (хорошо работает с установленным на нем virtualenv), conda, pyenv или некоторые другие инструменты. Вы должны иметь возможность создавать и уничтожать среды как неизменяемую инфраструктуру, они не должны быть драгоценными.
Давос
15

Для 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
  • Параметр -vor «verbose» добавит дополнительную информацию о каждом установленном пакете, включая путь, по которому он установлен. Это полезно, чтобы убедиться, что вы правильно поддерживаете виртуальные, пользовательские и системные установленные пакеты.

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

LightCC
источник
Нет ли способа скопировать состояние venv pip, т.е. без необходимости повторно загружать все библиотеки с помощью pip?
Айдо
Я не уверен, по какой причине вы хотели бы - это из-за ситуации с чрезвычайно низкой пропускной способностью в Интернете или из-за огромной необходимости дублировать много? Я считаю, что вы можете получить все zip-файлы из pypi, а затем установить их локально, но я не в курсе. Я знаю, что вы можете настроить локальный pip-сервер для размещения пакетов.
LightCC
Проблема (которую я пытаюсь решить) заключается в том, что я хочу запустить скрипт python на машине, которая не позволяет передавать сетевой трафик (или почти где угодно). Я могу помещать на него файлы, но он не может разговаривать с пипом. Несомненно, нишевый случай, но именно зачем мне перемещать эти вещи.
Ричард Раст,
@RichardRast Это другая проблема, я просто отвечаю на исходный вопрос. Примечание: есть решения вашей проблемы (загрузите пакеты в виде zip-архивов и установите локально, запустите зеркальный сервер PyPi за вашим брандмауэром и т. Д.), Но это
неверно
2
Вы можете создать колеса из всех своих пакетов с помощью, pip wheel . -w wheelsа затем просто переустановить пакеты в новой виртуальной среде с помощьюpip install --no-index --find-links /path/to/wheels/ -r requirements.txt
np8
7

--relocatableАргумент virtualenvпоявляется , чтобы позволить вам сделать это.

Рут Франклин
источник
//, это полагается только на относительные пути или как-то иначе?
Натан Басанезе
1
--relocatable работает только с существующими виртуальными средами. Запустите virtualenv --relocatable my-python-venvПОСЛЕ того, как среда уже существует.
hilcharge
1
От --help: This fixes up scripts and makes all .pth files relative. Нет, он не собирается делать библиотеки, независимые от платформы. Если вы хотите переместить его на другую платформу, вам нужно будет переустановить его на основе локального Python.
hilcharge
5
модуль python3 venv не поддерживает этот флаг
Нельсон
7

НО УВЫ:

Нет, просто нельзя 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и пользуйтесь, иначе без изменений?

Короткий ответ:

Я позволю Боромиру сказать это, чтобы он пояснил:

Ну, не могу .

Натан Басанезе
источник
2
если вы не хотите получить кровь и изменить его соответствующим образом: это ссылки в двоичных файлах в корзине, которые вызывают проблему с перемещением. Если вы знаете, откуда вы пришли, вы можете использовать что-то вроде find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;предположения, что ваш bin и lib находятся в вашей текущей папке venv. Я использую это как быстрый и грязный способ копирования и перемещения виртуальных env python3 с большим количеством установленных пакетов pip.
Пол Уипп
1
@PaulWhipp Есть ли преимущества в использовании этой команды по сравнению с простым использованием --relocatable? Кроме того, Натан, отличный вопрос, но это ужасный ответ. Принятие собственного ответа всегда немного предвзято, если только он хорошо не написан и четко не перечисляет варианты, но определение этого в любом случае будет субъективным.
Давос
1
@Davos --relocatable у меня не сработал, но я регулярно перемещаю файлы python3 venv, взламывая двоичные файлы, и пока у меня не было никаких проблем.
Пол Уипп,
1
Я намекал, что вы должны изменить принятое на другой (то есть не ваш) ответ. Возможно, тот, который выбрали народ: D
Давос,
3
Был задан вопрос: «Могу ли я просто mvиспользовать Venv?», А ответ был: «Нет, просто нельзя mv, есть обходные пути, но, возможно, будет проще переустановить». Если бы это был главный ответ, он бы сэкономил время мне и другим.
Николай
5

Да, это должно быть возможно, если вы не сделали ничего, что зависит от текущего каталога virtualenv.

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

В документации упоминается следующее :

Каждый virtualenv имеет информацию о пути, жестко закодированную в нем,

Например, если вы запустили, setvirtualenvprojectон не сможет переключиться в правильный каталог после запуска, workon ...поэтому в этом случае вам нужно будет исправить это вручную.

В общем, virtualenv - это не более чем каталог с необходимыми файлами интерпретатора Python и пакетами, которые вам нужны.

Симеон Виссер
источник
2

Используя ответы этого и других потоков на аналогичную тему, я создал сценарий bash, который, расположенный и выполняемый в самом каталоге virtualenv , поможет с вашими перемещениями virtualenv.

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

#!/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

Я надеюсь, что это помогает.

Гербы
источник
0

ДА, ТЫ МОЖЕШЬ! 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

Кайл Олодин
источник
Изменить old_directoryна old_directory- это опечатка?
подтверждено
черт возьми, да, спасибо
Кайл Оолодин