Коли опція -e, --editable може бути корисною при встановленні pip?


84

Коли може бути корисним параметр -e, або --editableваріант pip install?

Для деяких проектів останнім рядком у requirements.txt є -e .. Що саме робить?


6
Пов’язане: Python setup.py розробляти проти встановлювати ; pip install -eбіжить setup.py develop.
Мартін Пітерс

Відповіді:


81

Як сказано на сторінці користувача:

-e,--editable <path/url>
     Install a project in editable mode (i.e.  setuptools "develop mode") from a local project path or a VCS url.

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

Деякі самородки приблизно однакові тут і тут .


28
Це ще важко зрозуміти. Звичайно, я прочитав сторінку --help. Але це не допомогло. Скажімо, я щойно клонував репо під назвою 'abc'. І я встановлюю requirements.txt, який містить -e .. Чи зробить це якийсь пакет із setup.py доступним для редагування в пакеті сайту? Вибачте, можливо, потрібен приклад.
raitisd

10
@Raituha Хм, думаю, документація може бути дещо детальнішою щодо цього

Чи можете ви навести приклад: будь-які зміни оригінального пакету відображатимуться безпосередньо у вашому оточенні
змінна

6
@variable: Якщо ви встановите свій локальний проект з -eопцією ( pip install -e mypackage) і використовуєте його у своєму середовищі (наприклад, у вашому іншому проекті, наприклад from mypackage import custom_function), тоді, коли ви внесете будь-які зміни до свого custom_function, ви зможете використовувати цю оновлену версію, не перевстановлюючи її знову (з pip installабо python setup.py), що могло б статися у випадку пропуску -eпрапора.
Nerxis

1
@raitisd: Коли ви запускаєте pip install -r requirements.txt, він встановить всі необхідні пакети, а потім (якщо він є -e .) він повинен встановити поточний пакет у режимі розробки (наприклад, ви перебуваєте в mypackageпапці, і це еквівалентно запуску pip install -e ., тому будь-яка зміна в mypackageбезпосередньо відображається у вашому середовищі ). Жодних інших пакунків це не торкається.
Nerxis

5

Від роботи в режимі "розробки" :

Хоча це і не потрібно, звичайно локально встановлювати свій проект у режимі «для редагування» або «розробки» під час роботи над ним. Це дозволяє встановити та редагувати ваш проект у формі проекту.

Припустивши, що ви знаходитесь у кореневій директорії вашого проекту, виконайте:

pip install -e .

Хоча дещо загадковий, -eце скорочення --editableі .стосується поточного робочого каталогу, тому разом це означає встановлення поточного каталогу (тобто вашого проекту) у редагованому режимі.

Декілька додаткових уявлень про внутрішні елементи набору інструментів та дистрибутивів з "Режиму розробки" :

За звичайних обставин distutilsприпустіть, що ви збираєтеся створити дистрибутив свого проекту, а не використовувати його у „необробленій” чи „непобудованій” формі. Якби ви використовувалиdistutils спосіб, вам довелося б перебудовувати та перевстановлювати свій проект кожного разу, коли ви вносили зміни до нього під час розробки.

Інша проблема, яка іноді виникає distutils полягає тому, що вам може знадобитися одночасно розробляти два пов'язані проекти. Можливо, вам доведеться помістити пакети обох проектів в один каталог, щоб запустити їх, але вам потрібно тримати їх окремо для цілей контролю версій. Як ви можете це зробити?

Setuptools дозволяє розгортати ваші проекти для використання в загальному каталозі або проміжній області, але без копіювання будь-яких файлів. Таким чином, ви можете редагувати код кожного проекту в його каталозі оформлення замовлення, і потрібно лише запускати команди збірки, коли ви змінюєте розширення C проекту або аналогічно скомпільовані файли. Ви навіть можете розгорнути проект у каталозі оформлення замовлення іншого проекту, якщо це ваш улюблений спосіб роботи (на відміну від використання загальної незалежної проміжної області або каталогу пакетів сайтів).

Для цього скористайтеся setup.py developкомандою. Це працює дуже схоже на setup.py install, за винятком того, що насправді нічого не встановлює. Натомість він створює спеціальний .egg-linkфайл у каталозі розгортання, який посилається на вихідний код вашого проекту. Якщо ваш каталог розгортання є каталогом Python site-packages, він також оновить easy-install.pthфайл, включаючи вихідний код вашого проекту, тим самим роблячи його доступним sys.pathдля всіх програм, що використовують цю установку Python.


Режим редагування, режим редагування, режим розробки та режим розробки - це все те саме?
Kyle Delaney

1
@KyleDelaney Я вважаю, що так, але перед тим, як дати вам помилкову відповідь, я б запропонував вам відкрити нове запитання щодо SO. Мене також зацікавила б відповідь, тому не соромтеся розміщувати посилання і тут.
Кріс Граф

3

Конкретний приклад використання --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те, що робить цей виконуваний файл (або, можливо, ваш власний власний тест) просто знаходить пакет правильно в тому ж каталозі, в якому він живе.


2

Важливо зазначити, що 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% очищає все; навіть після того, як ви це зробили, імпорт (видаленої!) локальної бібліотеки може бути успішним, а спроба встановити ту ж версію з віддаленого сервера може не зробити нічого (оскільки вважає, що ваша (видалена!) локальна версія вже задумана дата).


Цікавий момент, так що по суті встановлення за допомогою --editable потенційно незворотне? Чи означає це, що тоді нам потрібно просто відмовитися від навколишнього середовища?
інформацією

4
Слід зазначити, що це вже не відповідає останнім версіям pip. Дивіться наступний коментар відповіді на переповнення стека: stackoverflow.com/questions/17346619/…
корінь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.