Come dichiarare in requisito.txt una fonte github diretta


448

Ho installato una libreria usando il comando

pip install git+git://github.com/mozilla/elasticutils.git

che lo installa direttamente da un repository Github. Funziona bene e voglio avere quella dipendenza nel mio requirements.txt. Ho visto altri biglietti come questo, ma questo non ha risolto il mio problema. Se metto qualcosa del genere

-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev

nel requirements.txtfile, si pip install -r requirements.txtottiene il seguente output:

Downloading/unpacking elasticutils==0.7.dev (from -r requirements.txt (line 20))
  Could not find a version that satisfies the requirement elasticutils==0.7.dev (from -r requirements.txt (line 20)) (from versions: )
No distributions matching the version for elasticutils==0.7.dev (from -r requirements.txt (line 20))

La documentazione del file dei requisiti non menziona i collegamenti che utilizzano l' git+gitidentificatore di protocollo, quindi forse questo non è supportato.

Qualcuno ha una soluzione per il mio problema?

Risposte:


327

La sintassi dei pacchetti "modificabili" può essere utilizzata requirements.txtper importare pacchetti da una varietà di VCS (git, hg, bzr, svn) :

-e git://github.com/mozilla/elasticutils.git#egg=elasticutils

Inoltre, è possibile indicare un commit particolare:

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils

3
Non sono riuscito a verificare localmente una versione così modificabile (probabilmente a causa di problemi di sintassi) e alla fine ho usato la git+gitvariante (che ha funzionato). Nella requirements.txttua versione funziona, quindi grazie mille :)
Alfe,

1
Il docscollegamento non funzionava per me; Ne ho usato uno più vecchio .
osa,

42
Quello che non ho capito è che la sintassi mostrata è esattamente ciò che va nei requisiti, cioè non c'è un nome di pacchetto prima di -e.
salvia il

5
L'aggiunta di "-e" non è necessaria a seconda che si desideri che il pacchetto sia in modalità modificabile, vedere la risposta di @qff.
Sky

17
Non dovrebbe essere -e git+git://invece di -e git://? Ho ricevuto un messaggio "dovrebbe essere un percorso verso un progetto locale o un URL VCS che inizia con svn +, git +, hg + o bzr +" .
Bruce Wayne,

424

Normalmente il tuo requirements.txtfile sarebbe simile al seguente:

package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...

Per specificare un repository Github, non è necessaria la package-name==convenzione.

Gli esempi seguenti si aggiornano package-twousando un repository GitHub. Il testo tra @e #indica i dettagli del pacchetto.

Specificare l'hash di commit ( 41b95ecnel contesto dell'aggiornamento requirements.txt):

package-one==1.9.4
git+git://github.com/path/to/package-two@41b95ec#egg=package-two
package-three==1.0.1

Specifica il nome del ramo ( master):

git+git://github.com/path/to/package-two@master#egg=package-two

Specifica tag ( 0.1):

git+git://github.com/path/to/package-two@0.1#egg=package-two

Specifica release ( 3.7.1):

git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two

Si noti che #egg=package-twonon è un commento qui, è di indicare esplicitamente il nome del pacchetto

Questo post sul blog ha qualche discussione in più sull'argomento.


54
Di tutte le altre risposte, non riesco a credere che nessuno di loro abbia appena mostrato un file di requisiti con una miscela di req "normali" con un git lanciato per il confronto. Ero così colpito da quelle che sembravano -eopzioni da riga di comando ( ). Grazie per aver mostrato una miscela di entrambi in modo da poterlo inserire nel contesto!
Hendy,

Indicare il rilascio 3.7.1con git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-twonon ha funzionato per me. Ciò che ha funzionato per me è stato git+git://github.com/path/to/package-two@3.7.1#egg=package-two.
Jean Paul

Questa risposta è stata molto utile. Una cosa però. Quella git+git://...notazione in qualche modo ha causato errori relativi a ssh sul mio box Linux. Così ho finito per passare a git+https://...notazione e poi funzionano perfettamente.
RayLuo

174

requirements.txtconsente i seguenti modi per specificare una dipendenza da un pacchetto in un repository git a partire da pip 7.0: 1

[-e] git+git://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+https://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+ssh://git.myproject.org/SomeProject#egg=SomeProject
-e git+git@git.myproject.org:SomeProject#egg=SomeProject

Per Github ciò significa che puoi fare (nota l'omesso -e):

git+git://github.com/mozilla/elasticutils.git#egg=elasticutils

Perché la risposta extra?
Sono stato un po 'confuso dalla -ebandiera nelle altre risposte, quindi ecco il mio chiarimento:

La bandiera -eo --editableindica che il pacchetto è installato in <venv path>/src/SomeProjecte quindi non nel sepolto profondo in <venv path>/lib/pythonX.X/site-packages/SomeProjectcui verrebbe altrimenti inserito. 2

Documentazione


9
Ma nota che se ometti il -etuo prossimo pip freezepotrebbe non dare i risultati corretti per questo pacchetto
Maccesch,

82

Innanzitutto, installa con git+gito git+https, come sai. Esempio di installazione kronokdel ramo del brabeionprogetto:

pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion

In secondo luogo, utilizzare pip freeze > requirements.txtper ottenere la cosa giusta nel tuo requirements.txt. In questo caso, otterrai

-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master

In terzo luogo, testare il risultato:

pip uninstall brabeion
pip install -r requirements.txt

4
pip freeze elenca ancora il pacchetto che uso come versione chiusa, anteriore. e non un checkout diretto su github
Antoine Claval,

4
Devi usare l'opzione '-e' per 'pip freeze' per generare un url
Janusz Skonieczny il

2
pip 9.0.1:no such option: -e
sds

Intendi git+https? Nel testo che dici git+gite nel codicegit+https
Antony Hatchkins,

@AntonyHatchkins riparato.
osa,

17

Dal momento che pip v1.5, (rilasciato il 1 gennaio 2014: CHANGELOG , PR ), puoi anche specificare una sottodirectory di un repository git per contenere il tuo modulo. La sintassi è simile al seguente:

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

Nota: come autore del modulo pip, idealmente probabilmente vorrai pubblicare il tuo modulo nel suo repository di livello superiore, se puoi. Tuttavia, questa funzione è utile per alcuni repository preesistenti che contengono moduli Python in sottodirectory. Potresti essere costretto a installarli in questo modo se non vengono pubblicati anche su Pypi.


1

Sto scoprendo che è un po 'difficile ottenere pip3 (v9.0.1, come installato dal gestore dei pacchetti di Ubuntu 18.04) per installare effettivamente la cosa che gli dico di installare. Sto pubblicando questa risposta per risparmiare tempo a chiunque si imbatta in questo problema.

Inserimento in un file requisito.txt non riuscito:

git+git://github.com/myname/myrepo.git@my-branch#egg=eggname

Per "fallito" intendo che mentre scaricava il codice da Git, ha finito per installare la versione originale del codice, come trovata su PyPi, invece del codice nel repository su quel ramo.

Tuttavia, l'installazione di commit anziché il nome del ramo funziona:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname

Sei sicuro che anche la tua filiale sia remota?
Alfe,

Non puntava a una copia locale, se è quello che ti stai chiedendo.
Getta via l'account
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.