Jak mogę sprawić, by setuptools zainstalowało pakiet, którego nie ma w PyPI?

142

Właśnie zacząłem pracować z setuptools i virtualenv. Mój pakiet wymaga najnowszego narzędzia Python-Gearman, który jest dostępny tylko z GitHub. Wersja Python-gearman na PyPI jest stara. Źródło Github jest kompatybilne z setuptools, tzn. Ma setup.py itp. Czy istnieje sposób, aby setuptools pobrał i zainstalował nową wersję zamiast szukać jej w PyPI i instalować starą?

FYI, nowy Python-Gearman to http://github.com/mtai/python-gearman

andrei
źródło
1
Czy jest jakiś powód, dla którego próbujesz zainstalować pakiet Pythona bezpośrednio z Gita, zamiast pobierać stamtąd źródło i używać go python setup.py installw katalogu źródłowym?
Andrew,
4
Chcę, aby mój pakiet został wdrożony na wielu komputerach, a wszystkie jego zależności są instalowane automatycznie.
andrei
2
Możesz użyć easy_installlub pipzainstalować go bezpośrednio z Github. Ale jest też inne rozwiązanie, czy rozważałeś dodanie pakietu do PyPI?
Wolph
2
Ponieważ jest to po prostu do wdrożenia, dlaczego nie użyć buildout? Ma kilka gotowych wtyczek Git.
Wolph
rozwiązanie tutaj: stackoverflow.com/a/17442663/1841871
zazabe

Odpowiedzi:

156

Kluczem jest wskazanie easy_install, gdzie można pobrać pakiet. W tym konkretnym przypadku można go znaleźć pod adresem URL http://github.com/mtai/python-gearman/tarball/master . Jednak ten link sam w sobie nie zadziała, ponieważ easy_install nie może stwierdzić, patrząc na adres URL, co otrzyma.

Zmieniając go na http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta zamiast tego easy_install będzie w stanie zidentyfikować nazwę pakietu i jego wersję.

Ostatnim krokiem jest dodanie adresu URL do pakietów dependency_links, np .:

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

Teraz, gdy TWÓJ pakiet jest instalowany, easy_install odkryje, że istnieje „gearman 2.0.0beta” dostępny do pobrania z tego adresu URL i szczęśliwie wybierze go zamiast tego na PyPI, jeśli określisz „gearman> = 2.0.0beta” w twoich zależnościach ...

(Zwykle sposobem tego rodzaju jest umieszczenie linku na swojej stronie PyPI do źródła do pobrania; w tym przypadku, jeśli autor pakietu gearman umieścił link taki jak powyżej, byłbyś już ustawiony . Zazwyczaj ludzie zaznaczają wersję rozwojową za pomocą „myproject-dev”, a następnie używają wymagania „myproject> = somever, == dev”, więc jeśli nie ma pakietu w jakimkolwiek lub wyższym, easy_install spróbuje sprawdź lub pobierz wydanie.)

Musisz określić, --process-dependency-linkskiedy używasz pip. Zauważ, że przetwarzanie linków zależności jest przestarzałe i zostanie usunięte w przyszłej wersji.

PJ Eby
źródło
1
Zrobiłem to, co zasugerowałeś, ale kiedy uruchamiam "python setup.py develop", mówi "piszę dependency_links do foo.egg-info / dependency_links.txt", ale tak naprawdę nie pobieram i nie instaluję pakietu. Jeśli to pomaga, używam virtualenv opartego na setuptools.
andrei
15
Musisz także mieć install_requires = 'gearman> = 2.0.0beta'; włączyłeś to?
PJ Eby
3
Nie działa dla mnie, z betasufiksem na istniejącej wersji na PyPI, nadal instaluje pakiet z PyPI zamiast tego zdefiniowanego w dependency_links. Jeśli spróbujesz ustawić wyższą wersję niż ta, która istnieje w PyPI z #egg=package-version, narzędzie konfiguracyjne zgłosi Could not find a version that satisfies the requirementbłąd i wyświetli listę wszystkich wersji dostępnych w PyPI. Zauważ, że próbuję skompilować mój pakiet za pomocą sdist, a następnie zainstalować go z pip install http://url/to/my/generated/tar.
zazabe
1
ok, instalując mój pakiet z easy_install http://url/to/my/generated/tar, wszystko działa zgodnie z oczekiwaniami ... Masz pojęcie dlaczego?
zazabe
3
--process-dependency-linkszostał usunięty od pip19! Zobacz: github.com/pypa/pip/issues/6162
phoenix
67

Możesz użyć pip install protocol+location[@tag][#egg=Dependency]formatu, aby zainstalować bezpośrednio ze źródła przy użyciu 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

Bystry

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

SVN

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

Bzr

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

Obsługiwane są następujące protokoły: [+git, +svn, +hg, +bzr]

Wersje

@tag pozwala określić konkretną wersję / tag do wyewidencjonowania.

#egg=name pozwala określić, czym jest projekt jako zależność dla innych.

Kolejność musi być zawsze @tag#egg=name.

Prywatne repozytoria

Możesz także zainstalować z prywatnych repozytoriów, zmieniając protokół na SSH ( ssh://) i dodając odpowiedniego użytkownika ( git@):

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

Możesz także zainstalować z prywatnych repozytoriów, podając nazwę użytkownika / hasło.

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

Github umożliwia tworzenie osobistych tokenów OAuth, które można cyklicznie

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

wymagania.txt

requirements.txt służy do określenia zależności projektu:

wymagania.txt

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

Nie są one instalowane automatycznie wraz z pakietem i należy je zainstalować za pomocą polecenia pip -r requirements.txt.

W tym pliki wymagań

Pliki wymagań mogą zawierać inne pliki wymagań:

wymagania-docs.txt

sphinx
-r requirements-dev.txt

wymagania-dev.txt

some-dev-tool
-r requirements.txt

wymagania.txt

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

setup.py

Pliki wymagań mogą instalować zależności określone w setup.pynastępującym poleceniu:

-e .

setup.pymożna również zainstalować z repozytoriów, używając tej samej składni co powyżej, ale używając dependency_linkswartości podanej w tej odpowiedzi .

Bibliografia:

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

Rebs
źródło
2
setup.py MOŻE zainstalować z repozytoriów. Po prostu wyszukaj „setup.py dependency_links”
TomDotTom,
1
@TomDotTom Derp, nawet głosowałem za tą odpowiedzią, ale jakoś jej nie przyswoiłem = P Zaktualizuję swoją odpowiedź. Dziękuję za zwrócenie uwagi! To pomoże w niektórych rzeczach, które robię.
Rebs
dependency_links Myślę, że jest to amortyzowane (?) github.com/pypa/pip/issues/3939 . Uwielbiam tę odpowiedź i myślę, że jest lepsza, ponieważ mogę (w setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.
21

Jak po prostu musiałem zrobić to samo, znalazłem inny sposób to zrobić jako pip„s --process-dependency-linksmają zostać usunięte w pip19,0 według tego komentarza .

pip 18.1 zawiera następującą funkcję

Zezwalaj na używanie wymagań adresu URL PEP 508 jako zależności.

Z opisu PEP 508 składnia takich zależności URL wygląda następująco:

Minimalne wyszukiwanie na podstawie adresu URL:

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

Więc w twoim setup.pyto by wyglądało

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

Zauważ, że odsyłacz jest plikiem archiwum i może być również konkretną wersją lub gałęzią repozytorium, jak opisano w tej odpowiedzi . Zobacz także tę odpowiedź dotyczącą pracy z innymi hostami repozytorium.

O ile wiem, najłatwiejszym sposobem zaktualizowania zależności jest użycie pip install -I .podczas instalowania pakietu z jego katalogu.

Phil
źródło
Czy obsługuje to również wszystko, co pip installobsługuje, takie jak adresy URL git #subdirectory=...itp.? A może wymyślili zupełnie nową składnię z różnymi funkcjami przedstawionymi w inny i niekompatybilny sposób?
remram
Jeśli nie używasz setuptools i nie zarządzasz zależnościami ręcznie w wierszu poleceń, wydaje się, że nadal musisz stosować podejście opisane w odpowiedzi @Rebs .
Phil
1
Potwierdzam tylko, że to działa distutils.core.setupipip 19.1.1
powinno się zobaczyć
Wynik requirements.txtnie jest jednak zgodny zpip install -r requirments.txt
powinien zobaczyć
@powinien requirments.txtzobaczyć, do kogo się odnosisz ?
Phil
6

Vanilla setuptoolsnie obsługuje pobierania bezpośrednio z repozytorium git, ale możesz użyć jednego z linków do źródła pobierania z tej strony, na przykład:

easy_install http://github.com/mtai/python-gearman/tarball/master
Ned Deily
źródło
Tak więc, aby upewnić się, że ta wersja python-gearman jest zainstalowana na dowolnym serwerze, na którym ma się znajdować mój pakiet, będę musiał ręcznie uruchomić easy_install przed zainstalowaniem mojego pakietu?
andrei
Jeśli używasz easy_install, tak. Ale, jak zauważyli inni, można przełączyć się na bardziej zaawansowane zarządzanie wymaganiami piplub takie, buildoutktóre mają bardziej wyrafinowane zarządzanie wymaganiami. Zobacz na przykład: pip.openplans.org/#requirements-files
Ned Deily
Właściwie nie musisz ręcznie uruchamiać easy_install; możesz po prostu dodać dodatkowy link do swojego setup.py. Napiszę odpowiedź wyjaśniającą szczegóły.
PJ Eby
2
Jak wspomniałem w moim komentarzu powyżej, setup.py zapewnia dependency_links, które pozwalają na pobieranie z repozytorium gti
TomDotTom.