Як дублювати virtualenv


130

У мене є існуючий virtualenv з великою кількістю пакунків, але стара версія Django.

Що я хочу зробити, це дублювати це середовище, тож у мене є інше середовище з точно такими ж пакетами, але новіша версія Django. Як я можу це зробити?


3
Я б піп заморозив всі ваші вимоги у файл 'вимоги.txt' та створив би ще один віртуаленв і запустив вимоги до встановлення файлів.txt
Calvin Cheng

Якщо версія віртуального середовища python, яку ви хочете скопіювати, відрізняється від середовища вашого virtualenv -p /path/to/older/venv/bin/python new_venvrequirements.txtpip freeze
пітону

Відповіді:


183

Найпростіший спосіб - використовувати pip для створення файлу вимог. Файл вимог - це файл, який містить перелік усіх пакунків python, які ви хочете встановити (або вже встановлені у випадку файлу, створеного файлом pip), та версії, у яких вони є.

Щоб створити файл вимог, увійдіть у свій початковий virtualenv та запустіть:

pip freeze > requirements.txt

Це створить requirements.txt файл для вас. Якщо ви відкриєте цей файл у своєму улюбленому текстовому редакторі, ви побачите щось на зразок:

Django==1.3
Fabric==1.0.1
etc...

Тепер відредагуйте рядок, в якому сказано, Django==x.xщоб сказати Django==1.3(або будь-яку версію, яку ви хочете встановити у своєму новому virtualenv).

Нарешті, активуйте свій новий virtualenv та запустіть:

pip install -r requirements.txt

І піп буде автоматично завантажувати і встановлювати все пітон модулі , перераховані в вашому requirements.txt файлі, в будь-яких версіях зазначених вами!


3
Дякую! Під час гугла я знайшов стільки галасливих, брудних та заплутаних сторінок ... Ваше рішення таке чисте та просте ... це зробило мені день;)
dolma33

що робити, якщо я скопіюю папку і потім вставити її на іншу машину? Це спрацювало б? Припустимо, що, звичайно, вдалі залежності вдалося вирішити
Казки Падуа

Дійсно, це не так, як я з’ясував саме зараз.
horcle_buzz

Я бачу багато повідомлень Could not find a version that satisfies the requirement a_package=#.#.#Чи можна це легко вирішити? Я видалив рядок або змінив рівність на нерівність.
Зміна світу

Працює pyenvтакож. Дивовижна відповідь.
Леонард

29

Ще одним варіантом є використання virtualenv-cloneпакету:

Сценарій для клонування непереселеного virtualenv.


Привіт, я маю рацію припустити, що це дозволяє мені скопіювати ціле середовище пітона у файл. Тоді мені просто доведеться завантажити цей файл на новий комп’ютер / ОС, і я отримаю всі встановлені пакети свого сайту назад
aceminer

2
"virtualenv-клон джерело / ціль /" працював як шарм дякую!
ajankuv

переконайтеся, що ми встановили virtualenv-cloneпісля активації virtualenv
4givN

15

virtualenvwrapperнадає команду для дублювання virtualenv

cpvirtualenv ENVNAME [TARGETENVNAME]

7
Не дуже гарна ідея. "Копіювання віртуальних середовищ недостатньо підтримується. Кожен virtualenv має жорстко закодовану інформацію про шлях, і можуть бути випадки, коли код копії не знає, що йому потрібно оновити певний файл. Використовуйте обережно."
Темак

5

Якщо ви використовуєте Anaconda, ви можете просто запустити:

conda create --name myclone --clone myenv

Це скопіює myenvновостворене середовище, яке називається myclone.


4

Найпростіший варіант - використання virtualenv-cloneпакету.

Для того, щоб дублювати venv1на venv2, виконайте наступні дії:

  1. Встановити virtualenv-cloneв будь-якому venv1або підробленому віртуальному середовищі venv_dummy. Щоб створити venv_dummy:

    python -m virtualenv venv_dummy
    source venv_dummy/bin/activate
  2. Щоб встановити virtualenv-clone:

    (venv_dummy): pip install virtualenv-clone
  3. Для копіювання venv1в venv2:

    (venv_dummy): virtualenv-clone venv1/ venv2/

підказка в bash не змінюється, доведеться редагувати bin / activate, а не на 100% зрозуміло, як
MrR

@MrR .. вам не доведеться редагувати, bin/activateякщо ви дотримуєтесь цієї відповіді. Чому ви повинні редагувати bin/activate?
Сафван

Після того, як я клонувався, мій bin/activate
підказ

1

Ви можете не просто:

  • Скопіюйте існуючий віртуальний каталог env в новий
  • Оновлення до нового Django?

7
Інколи я використовую такий підхід, але це незручність у необхідності оновлення деяких шляхів всередині сценарію bin / activate.
Армандо Перес Маркеш

3
Чи зміна є простою знахідкою та заміною на посиланнях на ім'я env, чи вона складніша за це?
Грег

1
У моєму випадку просто оновлення контуру в константу VIRTUAL_ENV у bin / activate зробило трюк
bryanph

1
З іншого боку, зміна бін / активації - це досить хакер, і потрібно задуматися, чи це може зламати речі в якийсь момент. Особливо, коли віртуальні середовища використовуються у виробничих налаштуваннях.
Герберт

2
Це багато ламає. Простіше просто відтворити або клонувати virtualenv. Я намагався зробити саме це (під час очікування відкриття проксі-сервера, щоб я міг перевстановити всі необхідні пакети і просто почати з нуля), і це не працює! Я думав, що я розумний, але, на жаль, знадобиться багато злому, щоб це почати працювати і, чесно кажучи, є набагато кращі речі.
horcle_buzz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.