Як я можу змусити setuptools встановити пакет, який не є на PyPI?


142

Я тільки почав працювати з setuptools та virtualenv. Мій пакет вимагає останнього екіпірування пітона, який доступний лише у GitHub. Версія python-gearman, що є на PyPI, є старою. Джерело Github сумісне з setuptools, тобто має setup.py тощо. Чи є спосіб змусити setuptools завантажити та встановити нову версію, а не шукати її на PyPI та встановлювати стару?

FYI, новий пітон-передач - http://github.com/mtai/python-gearman


1
Чи є причина, що ви намагаєтесь встановити пакет python безпосередньо з Git замість того, щоб завантажувати джерело звідти та використовувати python setup.py installу вихідному каталозі?
Андрій

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

2
Ви можете використовувати easy_installабо pipвстановити його прямо з Github. Але є й інше рішення, ви обмірковували додавання пакета до PyPI?
Вольф

2
Оскільки це просто для розгортання, чому б не використовувати buildout? У ньому є пара готових плагінів Git.
Вольф

Відповіді:


156

Головне - сказати easy_install, де можна завантажити пакет. У цьому конкретному випадку його можна знайти за адресою http://github.com/mtai/python-gearman/tarball/master . Однак це посилання само по собі не буде працювати, тому що easy_install не може сказати, просто подивившись на URL, що він отримає.

Змінивши його на http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta, натомість easy_install зможе визначити назву пакета та його версію.

Останнім кроком є ​​додавання URL-адреси до залежних_посилань вашого пакету, наприклад:

setup(
   ...
   dependency_links = ['http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta']
)

Тепер, коли ВАШ пакет встановлюється, easy_install виявить, що "завантажувач 2.0.0beta" доступний для завантаження з цієї URL-адреси, і щасливо підбере його на PyPI, якщо вказати "gearman> = 2.0.0beta" у ваших залежностях ..

(Зазвичай таким способом робиться те, щоб включити посилання на свою сторінку PyPI до джерела для завантаження; у такому випадку, якби автор пакету екіпажів включив посилання, як описано вище, ви вже встановили б Як правило, люди позначають версію розробки "myproject-dev", а потім люди використовують вимогу "myproject> = somever, == dev", так що якщо немає пакету з якогось іншого або вище, easy_install спробує перевірити або завантажити реліз.)

Вам потрібно буде вказати --process-dependency-linksпід час використання pip. Зауважте, що обробка посилань залежностей застаріла і буде видалена в майбутньому випуску.


1
Я зробив те, що ви запропонували, але коли я запускаю "python setup.py development", він говорить "писати залежність_посилання до foo.egg-info / залежність_links.txt", але насправді не завантажує та не встановлює пакет. Я використовую virtualenv на основі setuptools, якщо це допомагає.
andrei

15
Вам також потрібно встановити install_requires = 'gearman> = 2.0.0beta'; ти це включив?
PJ Eby

3
Це не працює для мене, за допомогою betaсуфікса на існуючій версії на PyPI він все одно встановить пакет з PyPI замість визначеного в dependency_links. Якщо ви спробуєте встановити більш високу версію, ніж ті, що існують на PyPI #egg=package-version, інструмент налаштування скаржиться на Could not find a version that satisfies the requirementпомилку та список усіх версій, доступних на PyPI. Зауважте, що я намагаюся створити свій пакет sdist, а потім встановити його pip install http://url/to/my/generated/tar.
zazabe

1
Ок, встановивши мій пакет easy_install http://url/to/my/generated/tar, все працює як очікувалося ... Будь-яка ідея чому?
zazabe

3
--process-dependency-linksбуло видалено станом на pip19! Дивіться: github.com/pypa/pip/isissue/6162
Phoenix

67

Ви можете використовувати pip install protocol+location[@tag][#egg=Dependency]формат для установки безпосередньо з джерела за допомогою pip.

Git

pip install git+https://github.com/username/repo.git
pip install git+https://github.com/username/repo.git@MyTag
pip install git+https://github.com/username/repo.git@MyTag#egg=ProjectName

Меркуріал

pip install hg+https://hg.myproject.org/MyProject/

SVN

pip install svn+svn://svn.myproject.org/svn/MyProject

Бзр

pip install bzr+http://bzr.myproject.org/MyProject/trunk

Наступні протоколи підтримуються: [+git, +svn, +hg, +bzr]

Версії

@tag дозволяє вказати конкретну версію / тег, щоб перевірити.

#egg=name дозволяє вказати, що таке проект як залежність для інших.

Замовлення завжди має бути @tag#egg=name.

Приватні сховища

Ви також можете встановити з приватних сховищ, змінивши протокол на SSH ( ssh://) та додавши відповідного користувача ( git@):

git+ssh://git@github.com/username/my_private_repo

Ви також можете встановити з приватних сховищ з ім'ям користувача / паролем.

git+https://<username>:<password>@github.com/<user>/<repo>.git

Github надає можливість створювати особисті маркери OAuth, які можна прокрутити

git+https://<oauth token>:x-oauth-basic@github.com/<user>/<repo>.git

вимоги.txt

requirements.txt використовується для визначення залежності проекту:

вимоги.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

Вони не встановлюються автоматично з пакетом і повинні бути встановлені командою pip -r requirements.txt.

У тому числі файли вимог

Файли вимог можуть включати інші файли вимог:

вимоги-docs.txt

sphinx
-r requirements-dev.txt

вимоги-dev.txt

some-dev-tool
-r requirements.txt

вимоги.txt

package1
package2==1.0.2
package3>=0.0.4
git+https://github.com/username/repo.git

setup.py

Файли вимог можуть встановлювати залежності, зазначені в setup.pyнаступній команді:

-e .

setup.pyтакож можна встановити з сховищ, використовуючи той самий синтаксис, що і вище, але використовуючи dependency_linksзначення, зазначене в цій відповіді .

Список літератури:

https://pip.pypa.io/en/latest/user_guide.html#installing-packages https://pip.pypa.io/en/latest/reference/pip_install.html


2
МОЖНА встановити з сховищ. Просто пошук "setup.py залежність_посилання"
TomDotTom

1
@TomDotTom Derp, я навіть схвалив цю відповідь, але якось не засвоїв її = P Я оновлю свою відповідь. Дякуємо, що вказали на це! Це допоможе вирішити деякі речі, які я роблю.
Ребс

залежність_посилання Я думаю, що амортизується, хоча (?) github.com/pypa/pip/isissue/3939 . Я люблю цю відповідь і вважаю, що це краще за те, що можна (в setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.

21

Як я повинен був зробити те ж саме, я знайшов ще один спосіб зробити це як pip«s --process-dependency-linksпланується зняти в pip19,0 в відповідно до цим коментарем .

pip 18.1 включає таку особливість

Дозволити використовувати вимоги URL-адреси PEP 508 як залежності.

З опису PEP 508, синтаксис таких залежностей URL виглядає так:

Мінімальний пошук на основі URL-адреси:

pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686

Так у вашому setup.pyце виглядатиме

setup(
   ...
   install_requires = [
   ...
   'python-gearman @ https://github.com/mtai/python-gearman/archive/master.zip'
   ...
   ]
)

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

Наскільки мені відомо, найпростіший спосіб оновити залежність - це використовувати pip install -I .при встановленні вашого пакету з його каталогу.


Чи підтримує це також все, що pip installпідтримує, наприклад, URL-адреси git #subdirectory=...тощо? Або вони придумали абсолютно новий синтаксис з різними ознаками, розкритим по-різному і несумісним чином?
ремрам

Якщо ви не використовуєте setuptools і керуєте залежностями вручну в командному рядку, здається, вам все одно доведеться використовувати підхід, описаний у відповіді @Rebs .
Філ

1
Просто , щоб підтвердити це працює з distutils.core.setupіpip 19.1.1
shouldsee

Отриманий в результаті requirements.txt, однак, не сумісний зpip install -r requirments.txt
shouldsee

@shouldsee, про який requirments.txtви маєте на увазі?
Філ

6

Vanilla setuptoolsне підтримує завантаження безпосередньо з сховища git, але ви можете використовувати одне із посилань на джерело завантаження з цієї сторінки, наприклад:

easy_install http://github.com/mtai/python-gearman/tarball/master

Отже, щоб переконатися, що ця версія python-gearman встановлена ​​на будь-якому сервері, де буде мій пакет, мені доведеться запустити easy_install вручну, перш ніж встановлювати пакет?
andrei

Якщо ви використовуєте easy_install, так. Але, як зазначали інші, ви можете перейти до pipабо buildoutмати більш складні системи управління вимогами. Дивіться, наприклад: pip.openplans.org/#requirements-files
Ned Deily,

Насправді, вам не потрібно вручну запускати easy_install; ви можете просто додати додаткове посилання до свого setup.py. Я напишу відповідь, де пояснюються деталі.
PJ Eby

2
Як уже згадувалося в коментарі вище, setup.py забезпечує залежність_посилання, яка дозволяє завантажувати з репозиторію gti
TomDotTom
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.