Яка різниця між venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv тощо?


1022

Python 3.3 включає в свою стандартну бібліотеку новий пакет venv. Що це робить, і чим він відрізняється від усіх інших пакетів, які, схоже, відповідають регексу (py)?(v|virtual|pip)?env?


20
І для того, щоб запобігти закриттю голосів, я вважав, що це питання більш загальне, ніж stackoverflow.com/questions/29950300/… , і тому мені не було зручно редагувати це питання або публікувати надто загальну відповідь на це повідомлення.
Flimm

12
Цей посібник є корисним і постійно оновлюється, оскільки python продовжує додавати більше & більше "один і лише один очевидний спосіб" робити речі: docs.python-guide.org/en/latest/dev/virtualenvs
michael

2
Станом на 3.6 мені стало легше працювати virtualenv, порівняно з pyenv на macOS (я pyNoob)
HashRocketSyntax

@HashRocketSyntax virtualenvі pyenvне виконують однакову функцію, і не є альтернативами один одному. Дивіться мою відповідь.
Flimm

6
Я цілий день горів, витрачаючи час на пипенві. Підсумок, це перекрито. Venv і virtualenv, якщо вам потрібен py2, є належними інструментами. Конда (мініконда, якщо вам не потрібен повний стек) також дуже гарна. Дуже хороший запис: chriswarrick.com/blog/2018/07/17/…
SwimBikeRun

Відповіді:


1382

Пакети PyPI не в стандартній бібліотеці:

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

    Він працює, встановивши купу файлів у каталозі (наприклад:) env/, а потім змінивши PATHзмінну середовища для префіксації її у користувацькому binкаталозі (наприклад:) env/bin/. Точна копія бінарної pythonабо python3бінарної файлів розміщується в цьому каталозі, але Python запрограмований спочатку шукати бібліотеки щодо його шляху в каталозі оточення. Він не є частиною стандартної бібліотеки Python, але офіційно благословенний PyPA (Python Packaging Authority). Після активації ви можете встановити пакунки у віртуальному середовищі за допомогою pip.

  • pyenvвикористовується для ізоляції версій Python. Наприклад, ви можете перевірити свій код на Python 2.7, 3.6, 3.7 та 3.8, тому вам знадобиться спосіб перемикання між ними. Після активації він префіксує PATHзмінну середовища ~/.pyenv/shims, де є спеціальні файли, що відповідають командам Python ( python, pip). Це не копії команди, що постачаються Python; це спеціальні сценарії, які вирішують на льоту, яку версію Python запускати на основі PYENV_VERSIONзмінної середовища, або .python-versionфайлу, або ~/.pyenv/versionфайлу. pyenvтакож полегшує процес завантаження та встановлення декількох версій Python, використовуючи команду pyenv install.

  • pyenv-virtualenvє плагіном pyenvтого самого автора pyenv, що дозволяє вам зручно користуватися pyenvі virtualenvв той же час. Однак якщо ви використовуєте Python 3.3 або пізнішої версії, pyenv-virtualenvви намагатиметеся запустити, python -m venvякщо він доступний, а не virtualenv. Ви можете користуватися virtualenvі pyenvразом без них pyenv-virtualenv, якщо не хочете зручності.

  • virtualenvwrapper- це набір розширень до virtualenv(див. документи ). Він дає вам команди, як mkvirtualenv, lssitepackagesі особливо workonдля перемикання між різними virtualenvкаталогами. Цей інструмент особливо корисний, якщо потрібно кілька virtualenvкаталогів.

  • pyenv-virtualenvwrapperце плагін для pyenvтого ж автора , як pyenv, зручно інтегрувати virtualenvwrapperв pyenv.

  • pipenvЦілі об'єднати Pipfile, pipі virtualenvв одну команду в командному рядку. virtualenvКаталог , як правило , отримує поміщається в ~/.local/share/virtualenvs/XXXс XXXбудучи хеш шлях директорії проекту. Це відрізняється від того virtualenv, де каталог зазвичай знаходиться в поточному робочому каталозі. pipenvпризначений для використання при розробці програм Python (на відміну від бібліотек). Є альтернативи pipenv, такі як poetry, які я тут не перелічу, оскільки це питання стосується лише пакетів, названих аналогічно.

Стандартна бібліотека:

  • pyvenvце сценарій, що постачається з Python 3, але застарілий у Python 3.6, оскільки у нього виникли проблеми (не кажучи вже про заплутане ім'я). У Python 3.6+ точніший еквівалент python3 -m venv.

  • venvце пакет, що постачається з Python 3, який ви можете запустити, використовуючи python3 -m venv(хоча чомусь деякі дистрибутиви відокремлюють його в окремий пакет дистрибутивів, наприклад, python3-venvна Ubuntu / Debian). Він служить тій самій цілі, що і virtualenv, але має лише підмножину своїх особливостей ( див. Порівняння тут ). virtualenvпродовжує користуватися популярністю venv, тим більше, що колишній підтримує і Python 2, і 3.

Рекомендація для початківців:

Це моя особиста рекомендація для початківців: почніть з навчання virtualenvта pip, інструментів, які працюють як з Python 2, так і з 3 та в різних ситуаціях, і підберіть інші інструменти, як тільки ви почнете потребувати в них.


115
Це дуже корисно! То чому 8 замішаних речей замість 1? ("Має бути один - і бажано лише один - очевидний спосіб зробити це." - Дзен Пітона)
Jerry101

59
@ Jerry101, введення venv частково є відповіддю на цей безлад. Якщо ви хочете допомогти покращити ситуацію, пропоную скористатися venv та заохочувати інших робити те саме.
Магнус Лінд Окслунд

31
"Введення venv частково є відповіддю на цей безлад" Як же, коли є занадто багато речей, які роблять "щось на кшталт X", люди завжди думають, що можуть поліпшити цей безлад, зробивши іншу річ, яка робить "щось на зразок X" . Свого сміху насправді. Зараз ми через 4 роки ... тож, можливо, доречно запитати, чи venvреально вирішила цю проблему?
Кріс

34
Єдині два інструменти у списку, які справді охоплюють те, що, можливо, однакова територія, - це virtualenv та venv, тому характеристика, яку ми маємо справу з безладом, спричиненою кількома конкуруючими інструментами, не дуже точна. Перелік, однак, складається з декількох інструментів, пов'язаних з віртуальним середовищем, і всі вони мають схожі звучать імена. Це може бентежити, особливо для користувачів, які тільки про них дізнаються. Чи покращив ситуацію Венв? Він запропонував більш легку альтернативу іншим інструментам віртуального середовища, користуючись натурними модифікаціями та місцем у стандартній бібліотеці. …
Магнус Лінд Окслунд

11
@cowbert Після лише оновлення з Python 3.5 до Python 3.6 та перерви у всіх моїх virtualenvs, схоже, venvви можете легше оновити до нової версії Python.
Даніель Н

276

Я б просто уникав використання virtualenvпісля Python3.3 + і замість цього використовував стандартну бібліотеку, що постачається venv. Щоб створити нове віртуальне середовище, ви введете:

$ python3 -m venv <MYVENV>  

virtualenvнамагається скопіювати бінарний файл Python у каталог бін віртуального середовища. Однак він не оновлює посилання на файли бібліотеки, вбудовані в цей двійковий файл, тому якщо ви будуєте Python з джерела в несистемний каталог з відносними іменами шляху, бінарний Python розривається. Оскільки саме так ви робите копіювальний Python, який роздається, це великий недолік. BTW для перевірки вбудованих посилань на файли бібліотеки на OS X, використовуйте otool. Наприклад, з вашого віртуального середовища введіть:

$ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

Отже, я б уникнув virtualenvwrapperі pipenv. pyvenvзастаріло. pyenvЗдається, він часто використовується там, де virtualenvйого використовують, але я б утримався від нього також, оскільки, думаю, venvтакож робить те pyenv, для чого створений.

venvстворює віртуальне середовище в оболонці, яке є свіжим та пісочним , із встановленими користувачем бібліотеками , і це багатопітонна безпека . Свіже, оскільки віртуальне середовище починається лише зі стандартних бібліотек, які постачаються з python, вам доведеться знову встановлювати будь-які інші бібліотеки, pip installпоки віртуальне середовище активне. Пісочниця, оскільки жодна з цих нових установок бібліотеки не видно за межами віртуального середовища, тому ви можете видалити все середовище та почати заново, не переживаючи про вплив на встановлення базового пітона. Бібліотеки, які встановлюються користувачем, оскільки цільова папка віртуальної середовища створена безsudoв деякому каталозі, який ви вже маєте, тому вам не знадобляться sudoдозволи на встановлення в нього бібліотек. Нарешті, це багатопітонна безпека , оскільки при активації віртуальних середовищ оболонка бачить лише версію python (3.4, 3.5 тощо), яка була використана для створення цього віртуального середовища.

pyenvподібний тим, venvщо дозволяє керувати кількома середовищами python. Однак, якщо pyenvви не можете зручно встановити бібліотеку відката до певного стартового стану, і вам, швидше за все, потрібні adminпривілеї в якийсь момент для оновлення бібліотек. Тому я думаю, що це також найкраще використовувати venv.

За останні кілька років я виявив багато проблем у системах збирання (пакети emacs, окремі розробники додатків python, інсталятори ...), які врешті-решт стикаються з проблемами virtualenv. Я думаю, що python стане кращою платформою, коли ми усунемо цю додаткову опцію та використовуватимемо лише venv.


3
add2virtualenvналаштовує вашу PYTHONPATH, додавши спеціальний _virtualenv_path_extensions.pthфайл під site-packages. Крім того, ви можете оновити PYTHONPATHзмінну середовища у bin/activateфайлі, який ви викликаєте щоразу, коли ви активуєте віртуальне середовище. Або ви можете додати посилання під вказівкою site-packagesна додаткові каталоги. Обидві ці альтернативи більш прозорі для традиційних інструментів командного рядка, які розробники широко використовують для усунення несправностей. Використання звичаю .pthз незадокументованою назвою робить ІМО більш магічним.
Riaz Rizvi

15
Гаразд, тому я підтвердив на stackoverflow.com/questions/48130371/…, що правильне оновлення PYTHONPATHусуває необхідність add2virtualenv. Що стосується відсутності допомоги на ПЗ з вашого першого коментаря, моє єдине пропозиція - це відповіді, якщо вони вирішили вашу проблему, щоб мотивувати людей вирішувати проблеми під час публікації? Півгодини розслідування + списання в обмін на клацання миші? Здається, що гарна торгівля ...
Riaz Rizvi

7
Ні, ви маєте рацію - я намагаюся бути добрим щодо призову. Чорт, якби ти був у моєму районі, я б купив тобі пиво. Я буду дотримуватися своєї обіцянки і побачу, чи дозволить пітфон док-файлів мені додати зміни до / bin / активувати офіційні документи для наочності. Хоча я і не великий, мені не страшно в пітоні. Якби мені було важко ... У будь-якому випадку, дякую за витрачений час - бажаю найкращого.
SteveJ

9
@ MalikA.Rumi благословення було дещо зведено до "творця Pipenv старанно продавали нам та іншим, саме тому ми згадуємо Pipenv".
Роб Грант

6
@AndreaMoro Це pyvenvзастаріле, а не pyenv. Це так просто плутати з назвами цих інструментів.
Даніель Холмс

24

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

ВІДМОВА:

Ця відповідь НЕ про продовження бурхливої ​​дискусії щодо достоїнств pipenv проти venv як конвертних рішень - я не схвалюю жодного . Йдеться про те, що PyPA підтримує суперечливі стандарти та те, як майбутня розробка virtualenv обіцяє відмовитись взагалі зробити / або вибір між ними. Я зосередився на цих двох інструментах саме тому, що вони є помазаними PyPA .

Венв

Як зазначає ОП, venv - це інструмент для віртуалізації середовищ. НЕ стороннє рішення, а рідний інструмент. PyPA схвалює venv для створення ВІРТУАЛЬНОГО РОЗВИТКУ : " Змінено у версії 3.5: Використання venv тепер рекомендується для створення віртуальних середовищ ".

пипенв

pipenv - як venv - може використовуватися для створення віртуальних конвертів, але додатково керованим пакетом управління тафункцією перевірки вразливості . Замість використанняrequirements.txt,pipenvзабезпечує управління пакетамидопомогою Pipfile . Оскільки PyPA схвалює pipenv для УПРАВЛІННЯ ПАКЕТИМИ , це, мабуть, означає,pipfileце замінитиrequirements.txt.

ОДНАК : pipenv використовує virtualenv в якості інструменту для створення віртуальних конвертів, НЕ venv , який схвалений PyPA як йти до інструменту для створення віртуальних конвертів.

Конфліктні стандарти:

Тож якщо рішення про віртуальну конверт не було достатньо складним, тепер у нас є PyPA, який підтримує два різних інструменти, які використовують різні рішення віртуальних конвертів. Бурхливі дебати Гітуба про венв проти віртуален, які висвітлюють цей конфлікт, можна знайти тут .

Вирішення конфліктів:

Дискусія про Github, на яку посилається вище посилання, спрямовувала розвиток virtualenv у напрямку розміщення venv у майбутніх випусках :

віддайте перевагу вбудованому venv: якщо цільовий пітон має venv, ми створимо середовище за допомогою цього (а потім виконаємо наступні операції над цим, щоб полегшити інші гарантії, які ми пропонуємо)

Висновок:

Таким чином, схоже, відбудеться деяке майбутнє зближення двох конкуруючих рішень для віртуальних конвертів, але на сьогоднішній день pipenv - який використовується virtualenv- істотно відрізняється від venv.

Зважаючи на проблеми, які вирішує pipenv, і той факт, що PyPA дав своє благословення, схоже , це світле майбутнє. І якщо virtualenv поставляє на запропонованих цілях в області розвитку, вибір віртуального рішення конверта більше не повинно бути випадково або pipenv АБО venv .


6
З того, що я зрозумів: фактичне значення pipenv вже дискутувалося вже давно, і його не було випущено більше року. Багато речей змінилося з того часу, і я заперечу, що для піпенв це тільки погіршилося (такі інструменти, як поезія та піп-інструменти, знаходяться в набагато кращій формі). У PyPA сторінки застаріли, і я б сказав , що вони повинні розжалувати pipenv . venv є стандартним інструментом і як такий є дуже ефективним, але має обмежений набір функцій. virtualenv не конкурує з venv, але намагається охопити сфери, куди venv не може або не хоче їхати (оскільки це стандарт).
sinoroc

@sinoroc Моя публікація не стосувалася достоїнств або pipenv. Це стосувалась суперечливих вказівок PyPA, що підтримують і pipenv AND venv, що ускладнює вибір рішення конверта, і те, як, здається, певна ступінь конвергенції заперечує необхідність вибору між ними взагалі. Зауважте, що я нічого не схвалюю, просто поділився тим, що я дізнався про те, як розвиваються ці два рішення, схвалені PyPA . З огляду на інтерес PyPA в них, незалежно від того , як я їх або не стає недоречною: pipenv і venv здавалося , швидше за все , стане частиною ландшафту
F1Linux

8
Я б сказав, як можна більше дотримуйтесь венв і піп . Ці два тут перебуванню, venv є частиною стандартної бібліотеки Python і в деякому сенсі піп , а так як він vendored в Python (через ensurepip ). Інші інструменти ( pyenv серія вбік: різна річ цілком), схоже, або покладаються або імітують (з більшим або меншим успіхом) venv та pip . Що чудово. Але якщо справи йдуть недобре , venv та pip - це безпечний запас. Єдиним іншим інструментом, яким я користуюся, є токсинтокси-венв), щоб допомогти створити та заповнити віртуальне середовище (прямо, ніякої магії, дивно, це ще не згадується).
sinoroc

2
Цей останній пост є золотом, оскільки він чудово працював у прасуванні зморшок. Я дотримуюся pip та venv, оскільки у мене були проблеми із звисаючими бінарними файлами з використанням virtualenv, коли системний пітон був оновлений.
codeviper

1
в минулому я стикався з проблемами з pipenv nonverbose щодо помилок. аргл і ров. Також: chriswarrick.com/blog/2018/07/17/…
qrtLs

3

Оновлення квітня 2020 року

Я шукав те саме, коли натрапив на цю посаду . Я думаю, що питання, яким інструментом користуватися, є досить заплутаним і складним для нових користувачів Python, як я. Це безпосередньо з веб-сайту PyPA щодо pipenv:

Хоча цей підручник охоплює проект pipenv як інструмент, який зосереджується в першу чергу на потребах розробки додатків Python, а не на розробці бібліотеки Python, сам проект наразі працює над декількома проблемами процесу та технічного обслуговування, які запобігають опублікуванню виправлень помилок та нових функцій ( з усього 2019 року проходить без нового випуску). Це означає, що в найближчій перспективі піпенв все ще страждає від декількох химерностей та проблем із виконанням роботи, не маючи чітких термінів вирішення цих питань.

Хоча так і залишається, керівники проектів, ймовірно, захочуть дослідити Інші інструменти управління залежностями додатків для використання замість pipenv або разом з ним.

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


Схоже, pipenv наразі (тобто у травні 2020 року) ще передусім до випуску до квітня 2020 року. Дивіться тут .
andrewjames

Це не відповідає на запитання.
Flimm

Я думаю, що @Flimm добре відповів на питання. Я відповідав на відповідь
F1Linux

Станом на 4 червня 2020 року pipenvгрупа випустила 2 версії для PyPI: 2020.5.28і зовсім недавно 2020.6.2: pypi.org/project/pipenv/#history
небуття
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.