Коли може бути корисним параметр -e
, або --editable
варіант pip install
?
Для деяких проектів останнім рядком у requirements.txt є -e .
. Що саме робить?
Відповіді:
Як сказано на сторінці користувача:
-e,--editable <path/url>
Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.
Отже, ви б використовували це при спробі встановити пакет локально, найчастіше у випадку, коли ви розробляєте його у своїй системі. Він просто прив’яже пакет до вихідного місця, в основному означає, що будь-які зміни в оригінальному пакеті відображатимуться безпосередньо у вашому середовищі.
-e .
. Чи зробить це якийсь пакет із setup.py доступним для редагування в пакеті сайту? Вибачте, можливо, потрібен приклад.
-e
опцією ( pip install -e mypackage
) і використовуєте його у своєму середовищі (наприклад, у вашому іншому проекті, наприклад from mypackage import custom_function
), тоді, коли ви внесете будь-які зміни до свого custom_function
, ви зможете використовувати цю оновлену версію, не перевстановлюючи її знову (з pip install
або python setup.py
), що могло б статися у випадку пропуску -e
прапора.
pip install -r requirements.txt
, він встановить всі необхідні пакети, а потім (якщо він є -e .
) він повинен встановити поточний пакет у режимі розробки (наприклад, ви перебуваєте в mypackage
папці, і це еквівалентно запуску pip install -e .
, тому будь-яка зміна в mypackage
безпосередньо відображається у вашому середовищі ). Жодних інших пакунків це не торкається.
Від роботи в режимі "розробки" :
Хоча це і не потрібно, звичайно локально встановлювати свій проект у режимі «для редагування» або «розробки» під час роботи над ним. Це дозволяє встановити та редагувати ваш проект у формі проекту.
Припустивши, що ви знаходитесь у кореневій директорії вашого проекту, виконайте:
pip install -e .
Хоча дещо загадковий,
-e
це скорочення--editable
і.
стосується поточного робочого каталогу, тому разом це означає встановлення поточного каталогу (тобто вашого проекту) у редагованому режимі.
Декілька додаткових уявлень про внутрішні елементи набору інструментів та дистрибутивів з "Режиму розробки" :
За звичайних обставин
distutils
припустіть, що ви збираєтеся створити дистрибутив свого проекту, а не використовувати його у „необробленій” чи „непобудованій” формі. Якби ви використовувалиdistutils
спосіб, вам довелося б перебудовувати та перевстановлювати свій проект кожного разу, коли ви вносили зміни до нього під час розробки.Інша проблема, яка іноді виникає
distutils
полягає тому, що вам може знадобитися одночасно розробляти два пов'язані проекти. Можливо, вам доведеться помістити пакети обох проектів в один каталог, щоб запустити їх, але вам потрібно тримати їх окремо для цілей контролю версій. Як ви можете це зробити?Setuptools дозволяє розгортати ваші проекти для використання в загальному каталозі або проміжній області, але без копіювання будь-яких файлів. Таким чином, ви можете редагувати код кожного проекту в його каталозі оформлення замовлення, і потрібно лише запускати команди збірки, коли ви змінюєте розширення C проекту або аналогічно скомпільовані файли. Ви навіть можете розгорнути проект у каталозі оформлення замовлення іншого проекту, якщо це ваш улюблений спосіб роботи (на відміну від використання загальної незалежної проміжної області або каталогу пакетів сайтів).
Для цього скористайтеся
setup.py develop
командою. Це працює дуже схоже наsetup.py install
, за винятком того, що насправді нічого не встановлює. Натомість він створює спеціальний.egg-link
файл у каталозі розгортання, який посилається на вихідний код вашого проекту. Якщо ваш каталог розгортання є каталогом Pythonsite-packages
, він також оновитьeasy-install.pth
файл, включаючи вихідний код вашого проекту, тим самим роблячи його доступнимsys.path
для всіх програм, що використовують цю установку Python.
Конкретний приклад використання --editable
в розробці
Якщо ви граєте з цим тестовим пакетом, як у:
cd ~
git clone https://github.com/cirosantilli/vcdvcd
cd vcdvcd
git checkout 5dd4205c37ed0244ecaf443d8106fadb2f9cfbb8
python -m pip install --editable . --user
він виводить:
Obtaining file:///home/ciro/bak/git/vcdvcd
Installing collected packages: vcdvcd
Attempting uninstall: vcdvcd
Found existing installation: vcdvcd 1.0.6
Can't uninstall 'vcdvcd'. No files were found to uninstall.
Running setup.py develop for vcdvcd
Successfully installed vcdvcd-1.0.6
Це Can't uninstall 'vcdvcd'
нормально: він намагався видалити будь-який існуючийvcdvcd
а потім замінити їх на "механізм, подібний до символічного посилання", який створюється на наступних етапах, але не вдався, оскільки попередніх установок не було.
Потім він генерує файл:
~/.local/lib/python3.8/site-packages/vcdvcd.egg-link
який містить:
/home/ciro/vcdvcd
.
і діє як "символічне посилання" до інтерпретатора Python.
Отже, якщо я внесу якісь зміни до вихідного коду git /home/ciro/vcdvcd
, це автоматично відображатиметься на імпортерах, які можуть з будь-якого каталогу:
python -c 'import vcdvcd'
Однак зауважте, що pip
принаймні в моїй версії двійкові файли, встановлені за допомогою --editable
, такі як vcdcat
скрипт, наданий цим пакетом через scripts=
on setup.py
, не отримують символічних посилань, а просто копіюються до:
~/.local/bin/vcdcat
так само, як і для звичайних інсталяцій, і тому оновлення сховища git не вплинуть безпосередньо на них.
Для порівняння, звичайне --editable
невстановлення з джерела git:
python -m pip uninstall vcdvcd
python -m pip install --user .
створює копію встановлених файлів під:
~/.local/lib/python3.8/site-packages/vcdvcd
Видалення редагованого пакету, як це було зроблено вище, вимагає достатньо нового pip, як згадувалося в: Як видалити редаговані пакети за допомогою pip (встановлено за допомогою -e)
Перевірено в Python 3.8, pip 20.0.2, Ubuntu 20.04.
Рекомендація: розробляйте безпосередньо всередині дерева, коли це можливо
Редаговане налаштування корисно, коли ви тестуєте виправлення до пакету за допомогою іншого проекту.
Якщо ви проте можете повністю перевірити свої зміни у дереві, просто зробіть це, замість того, щоб створювати редаговану інсталяцію, яка є більш складною.
Наприклад, наведений вище пакет vcdvcd налаштований таким чином, що ви можете просто cd
потрапити у джерело і обійтися ./vcdcat
без встановлення самого пакета (взагалі, можливо, вам доведеться встановити залежності від requirements.txt
), а також import vcdvcd
те, що робить цей виконуваний файл (або, можливо, ваш власний власний тест) просто знаходить пакет правильно в тому ж каталозі, в якому він живе.
Важливо зазначити, що pip uninstall
не вдається видалити модуль, який було встановлено pip install -e
. Тож якщо ви йдете цим маршрутом, будьте готові до того, що все стане дуже безладно, якщо вам коли-небудь доведеться видалити. Часткове рішення (1) переустановлення, зберігаючи запис файлів , створених, як і в sudo python3 -m setup.py install --record installed_files.txt
, а потім (2) вручну видалити всі файли в списку, як в наприклад sudo rm -r /usr/local/lib/python3.7/dist-packages/tdc7201-0.1a2-py3.7.egg/
(для випуску 0.1a2 модуля tdc7201). Однак це не на 100% очищає все; навіть після того, як ви це зробили, імпорт (видаленої!) локальної бібліотеки може бути успішним, а спроба встановити ту ж версію з віддаленого сервера може не зробити нічого (оскільки вважає, що ваша (видалена!) локальна версія вже задумана дата).
pip install -e
біжитьsetup.py develop
.