Wie kann ich mit pip aus einem Git-Unterverzeichnis installieren?

97

Ich habe ein Git-Repository mit vielen Ordnern, von denen einer ein Python-Modul ist, das mit pip installiert werden kann, wie folgt:

repo.git/
repo.git/folder1/
repo.git/folder2/
repo.git/mymodule/
repo.git/mymodule/__init__.py
repo.git/mymodule/setup.py
repo.git/mymodule/...

Im Moment muss ich Folgendes tun, um zu installieren:

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo

Ist es möglich, das Modul direkt mit pip zu installieren, ohne explizit zu klonen?

Ich habe es versucht:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/

Aber ich verstehe:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'
J. Martinot-Lagarde
quelle
1
Diese Frage scheint bereits beantwortet zu sein: stackoverflow.com/questions/10847764/pip-install-from-git-repo
Synthesizerpatel
1
Die Frage, die Sie verlinkt haben, betraf fehlende Dateien, da es keine MANIFEST.in gibt. Meine Frage ist, wie man ein Unterverzeichnis mit pip installiert. Es fehlen keine Dateien, da ich das Paket installieren kann, indem ich das gesamte Repo klone.
J. Martinot-Lagarde
@synthesizerpatel Die Frage, mit der Sie verlinkt haben, fragt nach etwas anderem, aber der Titel war irreführend, also habe ich ihn korrigiert. Sie können erwägen, Ihre (ich denke) Downvote zu entfernen.
Piotr Dobrogost

Antworten:

116

Es gibt eine Pull-Anfrage bezüglich dieser Funktion, und sie scheint vor einem Monat zusammengeführt worden zu sein, um einen Zweig zu entwickeln. Die Syntax lautet wie folgt :

pip install -e git+https://git.repo/some_repo.git#egg=version_subpkg&subdirectory=repo # install a python package from a repo subdirectory

Wir müssen wahrscheinlich eine Weile warten, bis es zum Master zusammengeführt und verteilt wird.

UPDATE : Dies ist jetzt verfügbar und unter https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support wie folgt dokumentiert :

Für Projekte, bei denen sich setup.py nicht im Stammverzeichnis des Projekts befindet, wird die Komponente "Unterverzeichnis" verwendet. Der Wert der Komponente "Unterverzeichnis" sollte ein Pfad sein, der vom Stamm des Projekts zu setup.py beginnt.

Wenn Ihr Repository-Layout also wie folgt lautet:

- pkg_dir/
  - setup.py  # setup.py for package ``pkg``
  - some_module.py
- other_dir/
  - some_file
- some_other_file

Sie müssen verwenden

pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir

Hinweis: Unter Windows müssen Sie die URL in doppelte Anführungszeichen setzen. Andernfalls wird die Fehlermeldung "Das Unterverzeichnis wird nicht als interner oder externer Befehl erkannt" angezeigt. Verwenden Sie zB:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"
Dennis Golomazov
quelle
4
Ich habe es gerade überprüft und es ist Teil von pip v1.5, veröffentlicht am 1. Januar 2014: github.com/pypa/pip/blob/develop/CHANGES.txt
tomka
20
Wenn Sie Ubuntu verwenden, stellen Sie sicher, dass Sie einfache Anführungszeichen vor dem tatsächlichen Git-Speicherort verwenden, da sonst das Unterverzeichnis & ignoriert wird! Zum Beispiel: pip install -e 'git + git.repo /… '
Lin
7
Nur ein Heads-up: Dies scheint bei Paketen, deren Einstiegspunkte im Unterverzeichnis liegen , nicht zu funktionieren (zumindest bei pip v1.5.6, bei 6+ Versionen nicht sicher) . pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'führt dazu, dass das Paket scheinbar installiert wird und eine package.egg-linkDatei in Site-Pakete eingefügt wird - aber es zeigt auf das Stammverzeichnis von src/repo, nicht auf src/repo/package, wie ich es erwarten würde. Dies bedeutet, dass py_modulesdas nicht importiert werden kann und entry_pointsnicht funktioniert: Beide erhöhen eine ImportError: No module named package.
Mark G.
2
-escheint notwendig, sonst pip freezezeigt nicht der ganze Weg, nur das Ei. Dies geschah ampip-1.5.4
26.
2
Tipp für andere: Sie MÜSSEN git + https verwenden, git + git funktioniert nicht, Sie werden schwerwiegend: Remote-Fehler: Repository nicht gefunden. vermutlich, weil es die "Abfrage" -String nicht richtig analysiert. Ich habe mich gerade angemeldet: github.com/pypa/pip/issues/4898
amohr
32

Es wurde bereits in einem der Kommentare unter der richtigen Antwort angegeben, aber nur um dieses Problem hervorzuheben: Wenn Sie dies über die Linux-Befehlszeile ausführen, müssen Sie das &Zeichen -zeichen umgehen, da kaufmännisches Und die Befehlszeile anweist, einen Befehl im Hintergrund auszuführen:

git+https://git.repo/some_repo.git#egg=version_subpkg\&subdirectory=repo

Beachten Sie den Backslash vor dem kaufmännischen Und. Das Escape-Verhalten hängt möglicherweise von der Linux-Distribution ab. Ich bin kein Experte.
Wenn Sie dies ignorieren, kann ein kryptischer Fehler wie der folgende auftreten:

bash: (...) command not found
Rinderwahn
quelle
1
Würde das Einschließen der URL in einfache Anführungszeichen dazu beitragen, die Notwendigkeit zu vermeiden, dem kaufmännischen Und zu entkommen? Ich weiß, dass dies hilfreich ist, wenn Sie mit URLs in cURL arbeiten.
Josh Peak
1
Ebenfalls erwähnenswert: Wenn Sie dies über die Windows-Befehlszeile ausführen, müssen Sie die URL in doppelte Anführungszeichen setzen. Andernfalls wird die Fehlermeldung "Unterverzeichnis 'wird nicht als interner oder externer Befehl erkannt" angezeigt. Verwenden Sie beispielsweise pip install -e "git + myurl / proj #gg = subpkg & subdirectory = subdir "
Verwenden Sie bei der Arbeit mit Shell-Skripten im Allgemeinen doppelte Anführungszeichen um Argumente, um auf der sicheren Seite zu sein. Weitere Best Practices finden Sie unter: shellcheck.net oder github.com/koalaman/shellcheck
Erik Aronesty
2
Das Escape ist auch in OSX notwendig (da es sich um eine Art Linux-Distribution handelt)
ygesher
5
Für die verzweigungsbasierte Installation verwenden Sie:pip install git+ssh://[email protected]/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK