webentwicklung-frage-antwort-db.com.de

pip ignoriert dependency_links in setup.py

Ich habe dependency_links in meiner setup.py:

...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#Egg=python-s3'],
...

Aber es geht nicht. Allerdings funktioniert install_requires einwandfrei. Vielleicht gibt es eine andere Methode, um git repo so einzurichten, wie es für setup.py erforderlich ist?

60
syabro

Diese Antwort sollte helfen. Kurz gesagt, müssen Sie die Version (oder "dev") für die #Egg=python-s3 so sieht es aus #Egg=python-s3-1.0.0.

Aktualisierungen basierend auf @ Cerins Kommentar:

  • Pip 1.5.x verfügt über ein Flag, um die Verarbeitung von Abhängigkeitsverknüpfungen zu ermöglichen: --process-dependency-links . Ich habe es nicht getestet, weil ich dem unten stehenden Punkt zustimme.
  • Diese Diskussion scheint darauf hinzudeuten, dass die Verwendung von Abhängigkeitsverbindungen für Pip eine schlechte Praxis ist. Obwohl diese Funktion für die Verfallserklärung eingetragen wurde, ist dies nicht mehr der Fall. Es gibt einen gültigen Anwendungsfall für private Pakete.
57
Laur Ivan

Mir ist klar, dass dies eine alte Frage ist, aber für den Fall, dass Sie sich hier wie ich befinden, hat dies für mich funktioniert.

Ich habe ein GitHub-Paket (nicht bei pypi registriert), das auf anderen GitHub-Paketen (nicht bei pypi) basiert. Ich habe übermäßig viel Zeit damit verbracht, herauszufinden, wie ich Pip dazu bringen kann, das richtig zu handhaben. Ich werde einschließen, was ich getan habe, um es hier zu beheben.

Das Einfügen von Abhängigkeiten in eine requirements.txt-Datei ist die bevorzugte Methode zum Auflisten von Abhängigkeiten. Sie müssen jedoch auch install_requires im Setup angeben. Zu diesem Zeitpunkt stieß ich auf eine Straßensperre mit Pip, die keine Abhängigkeiten von GitHub installieren wollte.

In den meisten Fällen, einschließlich der Antworten auf diese Frage, müssen Sie den Abschnitt "dependency_links" des Setups ausfüllen. Sie müssen jedoch auch das Feld install_requires mit dem Namen des Pakets füllen, auf das in dependency_links verwiesen wird.

Zum Beispiel, wenn Ihre requirements.txt Folgendes enthält.

somepackage==1.2.0
https://github.com/user/repo/tarball/master#Egg=repo-1.0.0
anotherpackage==4.2.1

Dann sollte Ihr Setup-Aufruf so aussehen:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0',
        'anotherpackage==4.2.1'
    ],
    dependency_links=[
        'https://github.com/user/repo/tarball/master#Egg=repo-1.0.0'
    ]
)

Ok, jetzt haben wir unser Paket konfiguriert. Die Installation ist die nächste Aufgabe. Hier habe ich viel Zeit verbracht. Ich konnte nicht herausfinden, warum die Angabe von dependency_links anscheinend nichts bewirkt hat. Der Trick ist, dass Sie in einigen Fällen das All-Extern-Zulassen-Flag (kann spezifischer sein) für pip setzen müssen. Beispielsweise:

pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external

Du bist fertig und es funktioniert!

HAFTUNGSAUSSCHLUSS: dependency_links und die Flags process-dependency-links und allow-all-external sind veraltet und werden demnächst entfernt. In der Zeit, die ich verbracht habe, konnte ich keine bessere, bevorzugte Methode finden und habe immer noch die richtige Pip-Funktion.

43
Chad

seit pip version 18.1 PEP 508 URL wird unterstützt. Das bedeutet, dass Sie die veralteten dependency_links nicht mehr benötigen. Sie schreiben die Abhängigkeit stattdessen direkt in die Liste install_requires. Das Beispiel von @Chad sieht folgendermaßen aus:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0 @ https://github.com/user/archive/master.Zip#Egg=repo-1.0.0',
        'anotherpackage==4.2.1'
    ],
)

Um Ihr Paket zu installieren, können Sie einfach schreiben:

pip install yourpackage

(ohne --process-dependency-links)

16
Easy_Israel

Ein paar Notizen zu einigen Problemen, die ich gefunden habe, insbesondere für die Installation von privaten Repos.

Die Installation von pip & setuptools weist einige subtile Unterschiede auf. aber dieser Weg sollte für beide funktionieren.

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#Egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ]

Ein paar Anmerkungen hier:

  • Für private Repos müssen Sie sich bei GitHub authentifizieren. Der einfachste Weg, den ich gefunden habe, besteht darin, ein oauth============================================================
  • Sie müssen einige Versionsnummer (hier ist 0) Am Ende des Links einfügen, auch wenn auf PyPI kein Paket vorhanden ist. Dies muss eine tatsächliche Zahl sein, kein Wort.
  • Sie müssen git+ Voranstellen, um setuptools mitzuteilen, dass das Repo geklont werden soll, anstatt auf einen Zip/Tarball zu zeigen
  • version kann eine Verzweigung, ein Tag oder ein Commit-Hash sein
  • Sie müssen --process-dependency-links Angeben, wenn Sie von pip installieren
13
Maximilian

Aktualisieren Sie zuerst Ihre Pip-Version, da dies eine neue Syntax ist.

pip install pip --upgrade

Dann machen Sie folgendes:

install_requires=[
    'bleualign-git @ https://github.com/rsennrich/Bleualign/archive/<commit-hash or branch-name>.Zip#Egg=bleualign-git-1.0.0'
]
  • Version 1.0.0 und Name "bluealign-git" werden zufällig ausgewählt.
  • Die Versionsnummer ist erforderlich.
  • Wir empfehlen, den Namen "bleualign-git" zu verwenden, um ihn von der Hauptversion des Repository zu unterscheiden.

Hoffe das hilft.

Bemerkungen:

Gute Antwort (upvoted). Erwähnen möchten wir auch, dass das tatsächliche Ergebnis wahrscheinlich von der Plattform- und/oder Pip-Version abhängt. Ich habe gesehen wenn es funktioniert oder anscheinend funktioniert, aber die Abhängigkeit nicht wirklich aus dem angegebenen Link gezogen oder einfach abgelehnt . Daher würde ich dies wahrscheinlich nur als kurzfristige Problemumgehung verwenden. Bleibe, wann immer möglich, beim Mainstream.

4
Tobias Ernst