Як клонувати робоче середовище Python на іншій машині?


26

Я розробив модель машинного навчання з Python (Anaconda + Flask) на своїй робочій станції, і все йде добре. Пізніше я спробував перенести цю програму на іншу машину, де, звичайно, я намагався налаштувати те саме середовище, але програма не запускається. Я скопіював програму на інші машини, де вона також працює безперебійно.

Я не можу зрозуміти, у чому полягає проблема у невдалому випадку (і код програми, і повідомлення про помилку є великим, тому я не в змозі їх тут представити), але я майже впевнений, що це щось із різними версіями залежностей .

Отже, моє запитання полягає в тому, що, враховуючи середовище, де певна програма працює добре, як я можу клонувати її до іншої, де вона також повинна добре працювати? Звичайно, без клонування повної системи;)


Використовуйте експорт conda env.
— кбросе

Відповіді:


39

Перш за все, це питання Python / Anaconda, і його, мабуть, слід задати в іншому підрозділі обміну стеками.


Що стосується самого питання - ви можете експортувати ваше середовище Anaconda, використовуючи:

conda env export > environment.yml

І відтворити його, використовуючи:

conda env create -f environment.yml

Зауважте, що, як пропонують інші, ви повинні використовувати віртуальне середовище, яке дозволяє створити певне середовище, яке відокремлене від середовища вашої машини та легше керувати ним.

Для створення віртуального середовища в Анаконда ви можете використовувати:

conda create -n yourenvname python=x.x anaconda

який ви активуєте за допомогою:

source activate yourenvname

Документація Anaconda не дуже чітка при використанні conda createабо conda env createпри обміні / відтворенні навколишнього середовища. Чи можете ви детальніше розказати, чому ви рекомендуєте використовувати conda env createв цій ситуації?
— Тангуй

Ви можете знайти деякі примітки про різницю між conda createі conda env createтут: groups.google.com/a/continuum.io/forum/#!topic/conda/… Однак, я думаю, що ви, як правило, зазвичай можете їх використовувати як взаємозамінні.
— ginge

1
Я бачив цю тему, але саме я намагаюся зрозуміти, в якій ситуації слід віддати перевагу кожному варіанту ( conda createvs conda env create) і які є недоліки кожного (наприклад: "[ conda env createє для] середовищ, в які були встановлені пакети, які використовують pip , що викликає додаткову складність ": яку додаткову складність вона додає?).
— Тангуй

Хочу запитати, що під час запуску conda env create -f environment.ymlце призведе до помилки, оскільки ім'я virtenv у файлі yml вже використано. Змініть ім'я на свій новий virtenv, щоб подолати.
— Джан Нгуйен

Таким чином рятує ваше життя! якщо ви створюєте середовище з файлу на основі інструкцій сторінки Anaconda Managing Environment, не працює, якщо ви використовуєте іншу платформу. conda list --explicit > FILE_NAMEекспортує бінарні файли для поточної платформи і, мабуть, не працює на іншій.
— Шаян Амані

5

Подивіться на "контейнери", наприклад Docker ( https://www.docker.com/what-container ), більш легку альтернативу віртуалізації.

Це зажадає певних витрат часу, але врешті-решт це дасть багато переваг.

За посиланням, де я вказав вашу конкретну потребу жирним курсивом :

Пакетне програмне забезпечення в стандартизовані підрозділи для розробки, відвантаження та розгортання

Зображення контейнера - це легкий, автономний, виконуваний пакет програмного забезпечення, який включає все необхідне для його запуску: код, час виконання, системні інструменти, системні бібліотеки, налаштування. Доступне для програм для ОС Linux та Windows, контейнерне програмне забезпечення завжди працюватиме однаково, незалежно від середовища . Контейнери ізолюють програмне забезпечення від його оточення, наприклад, відмінності між середовищем розробки та інсценування та допомагають зменшити конфлікти між командами, які працюють із різним програмним забезпеченням на одній інфраструктурі.


5

Перша конфігурація середовища експорту вашого поточного середовища conda, використовуючи:

conda-env  export -n your_env_name > your_env_name.yml

приклад:

conda-env  export -n base> base.yml

Після запуску вище команди вони повинні бути файлом конфігурації yml у вашому поточному каталозі, який містить інформацію про ваше середовище conda

Для створення нового середовища за допомогою запуску файлу конфігураційного файлу yml:

conda-env create -n new_env -f=\path\to\base.yml 

приклад:

conda-env create -n venv -f=base.yml

Якщо вищезгадане не спрацьовує (через різні проблеми самого конди), завжди варто спробувати з наступною варіацією:

conda-env create --name new_env --file \path\to\base.yml 

4

Якщо у вашій програмі переважно Python, ви можете покладатися виключно на віртуальне середовище.

Створіть віртуальні середовища для ізоляції залежностей, а не використання системних бібліотек. Потім використовуйте інструменти віртуального середовища для дублювання ваших середовищ.

У робочому virtualenv створіть файл із версією кожної встановленої бібліотеки Python:

pip freeze > requirements.txt

У новому virtualenv попросіть pipвстановити ці бібліотеки з тією ж версією:

pip install -r requirements.txt

Це гарантує отримання однакових версій на обох машинах. А оскільки вимоги.txt відслідковуються вашим VCS, ви завжди можете відтворити середовище старої версії коду.

Звичайно, якщо вам потрібна база даних, виробничий веб-сервер тощо, ви закінчите ще кілька кроків, і ви не можете розраховувати на virtualenv, щоб забезпечити збіг обох середовищ. Ось тут вступає Докер (див . Відповідь Pieter21 ).


Я не помітив anacondaтег у вашому запитанні. Я з цим не переживаю, але будьте обережні. Я думаю, що анаконда має власний спосіб керувати середовищами, використовуючи обидві анаконда, і це virtualenvможе привести вас до неприємностей. Однак, я вважаю, анаконда повинна пропонувати еквівалентні характеристики.
— Jérôme


1

Підсумок існуючих способів створення середовища на основі іншого:

  • Клонування середовища :

    • З існуючого середовища:

      $ conda create --name ORIG_ENV_NAME --clone CLONE_ENV_NAME

    • З експортованого файлу середовища на тій же машині:

      $ conda create --name ENV_NAME —-file FILE_NAME.yml

    • З експортованого файлу середовища на іншій машині:
      $ conda env export > ENV_NAME.yml
      $ conda env create -f ENV_NAME.yml```

$ conda create --name NEW_ENV_NAME --clone ORIG_ENV_NAME
— Б. Вс

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