Чи можу я перемістити virtualenv?


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

Ура, тепер ви можете встановлювати речі і завантажувати їх у своє недавно розташоване віртуальне середовище.


//, Гм. Це, здається, насправді не робить ці переміщувані. Я постійно отримую помилки щодо того, що вони не є "звичайними" файлами скриптів.
Натан Басанес

7
"В даний час опція --relocatable має низку проблем, і не гарантується, що вона працюватиме за будь-яких обставин. Можливо, ця опція буде застаріла в майбутній версії virtualenv. " (Наголошую на моєму), див. Посібник користувача
BobTuckerman

1
Я спробував це у вікнах, і помилка перелічує всі скрипти (* .py, * .bat, * .ps1) у Scriptsдиректорії (еквівалентно binon * nix) і каже щось на зразок того, що в activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.основному він скаржиться на те, що хеш-удар у файлі header - це не поточний virtualenv's python.exe, це той, з якого я його перемістив з -easy fixed. Я заглянув у цей шикарний сценарій, і він уже так чи інакше виявляє свій власний шлях - приємно. Деякі інші сценарії також не покладаються на шляхи (наприклад, disabletivate.bat), тому коротше, це працює.
Давос

2
@NathanBasanese повідомлення activate.ps1 cannot be made relativeможна проігнорувати, оскільки цей сценарій вже відносний. Повідомлення не є корисним у Windows, оскільки сценарії не використовують #!директиви, як у Linux, щоб вказувати оболонці, яка програма повинна його виконати. The activate.batне змінюється, але він не використовується (принаймні у Windows 10, виклик activateзапускає скрипт PoSH), тому ні, мені не потрібно було редагувати будь-які сценарії. Проблема полягає в тому, pip.exeякий шлях до python має жорсткий код і потребує редагування за допомогою hex-редактора або просто перевстановлення.
Давос,

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 для 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, і невелика помилка може бути поганою новиною.


Чи не існує способу копіювання стану piv venv, тобто без необхідності перезавантажувати всі бібліотеки за допомогою pip?
Айдо,

Я не впевнений, чому ви б хотіли - це через надзвичайно низьку пропускну здатність до Інтернету або величезну потребу дублювати багато? Я вважаю, що ви можете отримати всі zip-файли з pypi, а потім встановити локально, але я не в курсі цього. Я знаю, що ви можете налаштувати локальний pip-сервер для розміщення пакетів.
LightCC

Проблема (яку я намагаюся вирішити) полягає в тому, що я хочу запустити скрипт python на машині, яка не дозволяє мережевому трафіку піп (або майже в будь-якому місці). Я можу розміщувати на ньому файли, але він не може розмовляти з pip. Справа в ніші, але точно, чому мені потрібно перенести ці речі.
Річард Раст,

@RichardRast Це інша проблема, я просто відповідаю на вихідне запитання. Примітка: у вашій проблемі є рішення (завантажте пакети у форматі zip та локально встановіть, запустіть дзеркальний сервер PyPi за своїм брандмауером тощо), але це не правильно: запитання та відповіді на це ..
LightCC

2
Ви можете створити колеса з усіх своїх пакетів, pip wheel . -w wheelsа потім просто перевстановити пакети у новому віртуальному середовищі за допомогоюpip install --no-index --find-links /path/to/wheels/ -r requirements.txt
np8

7

--relocatableАргумент virtualenvз'являється , щоб дозволити вам зробити це.


//, Чи просто це покладається на відносні шляхи, чи це навколо якось інакше?
Nathan Basanese

1
- переміщуваний працює лише в існуючих віртуальних середовищах. Запустити virtualenv --relocatable my-python-venvПІСЛЯ середовища, яке вже існує.
підзарядка

1
Від --help: This fixes up scripts and makes all .pth files relative. Ні, це не збирається робити незалежними від платформ бібліотеки. Якщо ви хочете перенести його на іншу платформу, вам потрібно буде перевстановити його на основі локального python.
підзарядка

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, ergo смутку.

Хочете mvсвій контекстуальний virtualenvі використовувати його, в іншому випадку немодифицированного?

Коротка відповідь:

Я дам Боромиру це сказати, щоб він зрозумів:

Ну, я не можу .


2
окрім випадків, коли ви хочете отримати кров і модифікувати її відповідним чином: це посилання в бінарних файлах в кошику, які викликають проблему руху. Якщо ви знаєте, звідки ви прийшли, ви можете використати щось на зразок find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;припущення, що ваші bin і lib знаходяться у вашій поточній папці venv. Я використовую це як швидкий і брудний спосіб копіювання та переміщення віртуальних envs python3 з великою кількістю встановлених пакетів pip.
Пол Уіпп,

1
@PaulWhipp Чи є користь від використання цієї команди в порівнянні з простим використанням --relocatable? Крім того, Натане, чудове запитання, але це жахлива відповідь. Прийняття власної відповіді завжди є дещо упередженим, за винятком випадків, коли вона добре написана і чітко не перераховує варіанти, але визначаєш, що ти все одно будеш суб’єктивним.
Давос,

1
@Davos --relocatable не працював у мене, але я регулярно переміщую python3 venvs шляхом злому бінарних файлів, і до цих пір у мене не було проблем.
Пол Уіпп,

1
Я натякав, що вам слід змінити прийняту на іншу (тобто не вашу) відповідь Можливо, ту, яку обрали люди: D
Давос,

3
Питання було "чи можу я просто mvvenv?", А відповідь: "ні, ви не можете просто 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- це помилка друку?
вихід

ну блін, так це дякую
Кайл Олодін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.