Wie kann ich setuptools dazu bringen, ein Paket zu installieren, das nicht auf PyPI läuft?

142

Ich habe gerade angefangen mit Setuptools und Virtualenv zu arbeiten. Mein Paket erfordert den neuesten Python-Gearman, der nur bei GitHub erhältlich ist. Die Python-Gearman-Version von PyPI ist alt. Die Github-Quelle ist setuptools-kompatibel, dh hat setup.py usw. Gibt es eine Möglichkeit, setuptools zum Herunterladen und Installieren der neuen Version zu veranlassen, anstatt sie auf PyPI zu suchen und die alte zu installieren?

Zu Ihrer Information, der neue Python-Gearman ist http://github.com/mtai/python-gearman

andrei
quelle
1
Gibt es einen Grund, warum Sie versuchen, ein Python-Paket direkt von Git zu installieren, anstatt die Quelle von dort herunterzuladen und python setup.py installim Quellverzeichnis zu verwenden?
Andrew
4
Ich möchte, dass mein Paket auf mehreren Computern bereitgestellt und alle Abhängigkeiten automatisch installiert werden.
Andrei
2
Sie können es direkt von Github aus verwenden easy_installoder pipinstallieren. Es gibt aber auch eine andere Lösung. Haben Sie darüber nachgedacht, das Paket zu PyPI hinzuzufügen?
Wolph
2
Warum nicht verwenden, da es nur für die Bereitstellung vorgesehen ist buildout? Es hat ein paar vorgefertigte Git-Plugins.
Wolph

Antworten:

156

Der Schlüssel ist, easy_install mitzuteilen, wo das Paket heruntergeladen werden kann. In diesem speziellen Fall finden Sie es unter der URL http://github.com/mtai/python-gearman/tarball/master . Dieser Link allein funktioniert jedoch nicht, da easy_install nicht anhand der URL erkennen kann, was er erhalten wird.

Durch Ändern in http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta stattdessen , kann easy_install den Paketnamen und seine Version identifizieren.

Der letzte Schritt besteht darin, die URL zu den dependency_links Ihres Pakets hinzuzufügen, z.

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

Wenn IHR Paket installiert wird, stellt easy_install fest, dass unter dieser URL ein "gearman 2.0.0beta" zum Herunterladen verfügbar ist, und wählt ihn gerne über dem auf PyPI aus, wenn Sie "gearman> = 2.0.0beta" angeben. in Ihren Abhängigkeiten ..

(Normalerweise wird auf diese Weise ein Link auf der PyPI-Seite zur herunterladbaren Quelle eingefügt. In diesem Fall wären Sie bereits festgelegt, wenn der Autor des Gearman-Pakets einen Link wie den oben genannten eingefügt hätte Normalerweise markieren Benutzer die Entwicklungsversion mit 'myproject-dev' und verwenden dann die Anforderung 'myproject> = somever, == dev', sodass easy_install dies versucht, wenn es kein Paket von somever oder höher gibt Schauen Sie sich die Version an oder laden Sie sie herunter.)

Sie müssen angeben, --process-dependency-linkswenn Sie verwenden pip. Beachten Sie, dass die Verarbeitung von Abhängigkeitsverknüpfungen veraltet ist und in einer zukünftigen Version entfernt wird.

PJ Eby
quelle
1
Ich habe getan, was Sie vorgeschlagen haben, aber wenn ich "python setup.py Develop" ausführe, heißt es "Dependency_links to foo.egg-info / dependency_links.txt schreiben", aber das Paket wird nicht heruntergeladen und installiert. Ich verwende eine Setuptools-basierte virtuelle Umgebung, wenn das hilft.
Andrei
15
Sie müssen auch install_requires = 'gearman> = 2.0.0beta' haben; Hast du das aufgenommen?
PJ Eby
3
Es funktioniert bei mir nicht, mit dem betaSuffix einer vorhandenen Version auf PyPI wird das Paket weiterhin von PyPI anstelle des in definierten Pakets installiert dependency_links. Wenn Sie versuchen, eine höhere Version als die auf PyPI vorhandene festzulegen #egg=package-version, beschwert sich das Setup-Tool mit einem Could not find a version that satisfies the requirementFehler und einer Liste aller auf PyPI verfügbaren Versionen. Beachten Sie, dass ich versuche, mein Paket mit zu erstellen sdistund es dann mit zu installieren pip install http://url/to/my/generated/tar.
Zazabe
1
ok, durch die Installation meines Pakets mit easy_install http://url/to/my/generated/tarfunktioniert alles wie erwartet ... Irgendeine Idee warum?
Zazabe
3
--process-dependency-linkswurde ab pip19 entfernt! Siehe: github.com/pypa/pip/issues/6162
Phoenix
67

Sie können das pip install protocol+location[@tag][#egg=Dependency]Format verwenden, um mit pip direkt von der Quelle zu installieren.

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

Mercurial

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

Folgende Protokolle werden unterstützt: [+git, +svn, +hg, +bzr]

Versionen

@tag Mit dieser Option können Sie eine bestimmte Version / ein bestimmtes Tag zum Auschecken angeben.

#egg=name Hier können Sie angeben, was das Projekt als Abhängigkeit für andere ist.

Die Reihenfolge muss immer sein @tag#egg=name.

Private Repositories

Sie können auch aus privaten Repositorys installieren, indem Sie das Protokoll in SSH ( ssh://) ändern und einen geeigneten Benutzer ( git@) hinzufügen :

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

Sie können auch von privaten Repositorys mit einem Benutzernamen / Passwort installieren.

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

Github bietet die Möglichkeit, persönliche OAuth-Token zu erstellen, die mit dem Fahrrad gefahren werden können

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

Anforderungen.txt

requirements.txt wird verwendet, um Projektabhängigkeiten anzugeben:

Anforderungen.txt

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

Diese werden nicht automatisch mit dem Paket installiert und müssen mit dem Befehl installiert werden pip -r requirements.txt.

Einschließlich Anforderungsdateien

Anforderungsdateien können andere Anforderungsdateien enthalten:

Anforderungen-docs.txt

sphinx
-r requirements-dev.txt

Anforderungen-dev.txt

some-dev-tool
-r requirements.txt

Anforderungen.txt

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

setup.py

Anforderungsdateien können Abhängigkeiten installieren, die setup.pymit dem folgenden Befehl angegeben wurden:

-e .

setup.pykann auch aus Repositorys mit derselben Syntax wie oben installiert werden, jedoch mit dem dependency_linksin dieser Antwort genannten Wert .

Verweise:

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

Rebs
quelle
2
setup.py KANN von Repositorys installiert werden. Suchen Sie einfach nach 'setup.py dependency_links'
TomDotTom
1
@TomDotTom Derp, ich habe diese Antwort sogar positiv bewertet, aber irgendwie nicht aufgenommen = P Ich werde meine Antwort aktualisieren. Vielen Dank für den Hinweis! Es wird bei einigen Dingen helfen, die ich tue.
Rebs
dependency_links Ich denke, es wird zwar abgeschrieben (?) github.com/pypa/pip/issues/3939 . Ich liebe diese Antwort und denke, es ist besser, weil ich in der Lage bin (in setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.
21

Da musste ich einfach das gleiche tun, fand ich eine andere Möglichkeit , dies zu tun , wie pip‚s --process-dependency-linksgeplant sind entfernt wird pipnach 19,0 diesen Kommentar .

pip 18.1 enthält die folgende Funktion

Zulassen, dass PEP 508-URL-Anforderungen als Abhängigkeiten verwendet werden.

Aus der Beschreibung von PEP 508 geht hervor, dass die Syntax für solche URL-Abhängigkeiten wie folgt aussieht:

Eine minimale URL-basierte Suche:

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

Also in deinem setup.pywürde es so aussehen

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

Beachten Sie, dass der Link eine Archivdatei ist und auch eine bestimmte Version oder ein Zweig eines Repositorys sein kann, wie in dieser Antwort beschrieben . Siehe auch diese Antwort für die Arbeit mit anderen Repository-Hosts.

Nach meinem besten Wissen können Sie die Abhängigkeit am einfachsten aktualisieren, pip install -I .indem Sie Ihr Paket aus seinem Verzeichnis installieren.

Phil
quelle
Unterstützt dies auch alles, was pip installunterstützt wird, wie z. B. Git-URLs #subdirectory=...usw.? Oder haben sie eine brandneue Syntax entwickelt, bei der verschiedene Funktionen auf unterschiedliche und inkompatible Weise angezeigt werden?
Remram
Wenn Sie setuptools nicht verwenden und Abhängigkeiten manuell in der Befehlszeile verwalten, müssen Sie anscheinend immer noch den in der Antwort von @Rebs beschriebenen Ansatz verwenden .
Phil
1
Nur um zu bestätigen, dass dies mit funktioniert distutils.core.setupundpip 19.1.1
sollte der
Das Ergebnis requirements.txtist jedoch nicht kompatibel mitpip install -r requirments.txt
sollte
@shouldsee auf welche requirments.txtbeziehen Sie sich?
Phil
6

Vanilla setuptoolsunterstützt das Herunterladen nicht direkt aus einem Git-Repository. Sie können jedoch einen der Download Source- Links von dieser Seite verwenden, z.

easy_install http://github.com/mtai/python-gearman/tarball/master
Ned Deily
quelle
Um sicherzustellen, dass diese Version von Python-Gearman auf einem Server installiert ist, auf dem sich mein Paket befindet, muss ich easy_install manuell ausführen, bevor ich mein Paket installiere.
Andrei
Wenn Sie easy_install verwenden, ja. Aber, wie andere haben darauf hingewiesen, könnten Sie wechseln pipoder buildoutdie mehr anspruchsvolle Anforderungsmanagement. Siehe zum Beispiel: pip.openplans.org/#requirements-files
Ned Deily
Eigentlich müssen Sie easy_install nicht manuell ausführen. Sie können einfach den zusätzlichen Link zu Ihrer setup.py hinzufügen. Ich werde eine Antwort schreiben, die die Details erklärt.
PJ Eby
2
Wie in meinem Kommentar oben erwähnt, bietet setup.py dependency_links, mit denen Sie von einem GTI-Repository herunterladen können
TomDotTom