Come posso fare setuptools installare un pacchetto che non è su PyPI?


142

Ho appena iniziato a lavorare con setuptools e virtualenv. Il mio pacchetto richiede l'ultimo python-gearman disponibile solo da GitHub. La versione di Python-Gearman su PyPI è vecchia. Il sorgente Github è compatibile con setuptools, cioè ha setup.py, ecc. C'è un modo per fare in modo che setuptools scarichi e installi la nuova versione invece di cercarla su PyPI e installare quella vecchia?

Cordiali saluti, il nuovo python-gearman è http://github.com/mtai/python-gearman


1
C'è un motivo per cui stai cercando di installare un pacchetto Python direttamente da Git invece di scaricare il sorgente da lì e utilizzarlo python setup.py installnella directory dei sorgenti?
Andrew,

4
Voglio che il mio pacchetto sia distribuito su più macchine e che tutte le sue dipendenze vengano installate automaticamente.
andrei,

2
Puoi usarlo easy_installo pipinstallarlo direttamente da Github. Ma c'è anche un'altra soluzione, hai pensato di aggiungere il pacchetto a PyPI?
Wolph,

2
Dal momento che è semplicemente per la distribuzione, perché non utilizzare buildout? Ha un paio di plugin Git già pronti.
Wolph,

Risposte:


156

La chiave è dire a easy_install dove è possibile scaricare il pacchetto. In questo caso particolare, è disponibile all'indirizzo http://github.com/mtai/python-gearman/tarball/master . Tuttavia, quel collegamento da solo non funzionerà, perché easy_install non può dire semplicemente guardando l'URL che cosa otterrà.

Modificandolo in http://github.com/mtai/python-gearman/tarball/master#egg=gearman-2.0.0beta invece, easy_install sarà in grado di identificare il nome del pacchetto e la sua versione.

Il passaggio finale consiste nell'aggiungere l'URL ai collegamenti_dipendenze del pacchetto, ad esempio:

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

Ora, quando il TUO pacchetto verrà installato, easy_install scoprirà che esiste un "gearman 2.0.0beta" disponibile per il download da quell'URL e lo sceglierà felicemente su quello su PyPI, se specifichi "gearman> = 2.0.0beta" nelle tue dipendenze ..

(Normalmente, questo modo di fare è includere un link nella propria pagina PyPI alla fonte scaricabile; in questo caso, se l'autore del pacchetto gearman avesse incluso un link come sopra, saresti già impostato In genere, le persone contrassegnano la versione di sviluppo con 'myproject-dev' e quindi le persone usano un requisito di 'myproject> = somever, == dev', in modo che se non esiste un pacchetto di alcuni o più, easy_install proverà a controlla o scarica la versione.)

Dovrai specificare --process-dependency-linksquando lo usi pip. Si noti che l'elaborazione dei collegamenti di dipendenza è stata deprecata e verrà rimossa in una versione futura.


1
Ho fatto quello che mi hai suggerito, ma quando eseguo "python setup.py Develop", dice "scrivere dependency_links su foo.egg-info / dependency_links.txt", ma in realtà non scarica e installa il pacchetto. Sto usando un virtualenv basato su setuptools se questo aiuta.
andrei,

15
Devi anche avere install_requires = 'gearman> = 2.0.0beta'; l'hai incluso?
PJ Eby,

3
Non funziona per me, con il betasuffisso su una versione esistente su PyPI, installerà comunque il pacchetto da PyPI invece di quello definito in dependency_links. Se si tenta di impostare una versione successiva rispetto a quella esistente su PyPI #egg=package-version, lo strumento di installazione lamenterà un Could not find a version that satisfies the requirementerrore e un elenco di tutte le versioni disponibili su PyPI. Nota che sto cercando di compilare il mio pacchetto con sdist, quindi installarlo con pip install http://url/to/my/generated/tar.
Zazabe,

1
ok, installando il mio pacchetto con easy_install http://url/to/my/generated/tar, tutto funziona come previsto ... Qualche idea sul perché?
zazabe,

3
--process-dependency-linksè stato rimosso dal pip19! Vedi: github.com/pypa/pip/issues/6162
phoenix

67

Puoi usare il pip install protocol+location[@tag][#egg=Dependency]formato per installare direttamente dal sorgente usando pip.

Idiota

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

mutevole

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

Sono supportati i seguenti protocolli: [+git, +svn, +hg, +bzr]

versioni

@tag ti consente di specificare una versione / tag specifica da verificare.

#egg=name consente di specificare quale sia il progetto come dipendenza per gli altri.

L'ordine deve essere sempre @tag#egg=name.

Archivi privati

Puoi anche installare da repository privati ​​cambiando il protocollo in SSH ( ssh://) e aggiungendo un utente appropriato ( git@):

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

Puoi anche installare da repository privati ​​con un nome utente / password.

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

Github offre la possibilità di creare token OAuth personali che possono essere ciclati

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

requirements.txt

requirements.txt viene utilizzato per specificare le dipendenze del progetto:

requirements.txt

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

Questi non vengono installati automaticamente con il pacchetto e devono essere installati con il comando pip -r requirements.txt.

Compresi i file dei requisiti

I file dei requisiti possono includere altri file dei requisiti:

Requisiti-Docs.txt

sphinx
-r requirements-dev.txt

Requisiti-dev.txt

some-dev-tool
-r requirements.txt

requirements.txt

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

setup.py

I file dei requisiti possono installare le dipendenze specificate setup.pycon il seguente comando:

-e .

setup.pypuò anche installare da repository usando la stessa sintassi di cui sopra, ma usando il dependency_linksvalore indicato in questa risposta .

Riferimenti:

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


2
setup.py PU install installare dai repository. Basta cercare "setup.py dependency_links"
TomDotTom il

1
@TomDotTom Derp, ho persino votato a favore di quella risposta ma in qualche modo non l'ho assimilata = P Aggiornerò la mia risposta. Grazie per la segnalazione! Aiuterà con alcune cose che sto facendo.
Rebs

dependency_links Penso che sia stato deprezzato (?) github.com/pypa/pip/issues/3939 . Adoro questa risposta e penso che sia meglio grazie alla possibilità (in setup.py):extras_require={'all': [repo @ git+https://github.com/username/repo.git]}
Josiah L.

21

Dato che dovevo solo fare la stessa cosa, ho trovato un altro modo per farlo dato pipche --process-dependency-linksè programmato per essere rimosso in pip19.0 secondo questo commento .

pip 18.1 include la seguente funzione

Consenti ai requisiti PEP 508 URL di essere utilizzati come dipendenze.

Dalla descrizione di PEP 508, la sintassi per tali dipendenze URL appare come:

Una ricerca basata su URL minimo:

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

Quindi nel tuo setup.pysarebbe simile

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

Si noti che il collegamento è un file di archivio e potrebbe anche essere una versione specifica o un ramo di un repository come descritto in questa risposta . Inoltre, vedi quella risposta per lavorare con altri host di repository.

Per quanto ne so, il modo più semplice per aggiornare la dipendenza è utilizzare pip install -I .quando si installa il pacchetto dalla sua directory.


Questo supporta anche tutto ciò che pip installsupporta, come URL git, #subdirectory=...ecc? Oppure hanno escogitato una sintassi nuova di zecca con caratteristiche diverse esposte in modo diverso e incompatibile?
remram,

Se non usi setuptools e gestisci le dipendenze manualmente dalla riga di comando sembra che devi ancora usare l'approccio descritto dalla risposta di @Rebs .
Phil

1
Solo per confermare che funziona con distutils.core.setupepip 19.1.1
dovresti vedere

La risultante requirements.txt, tuttavia, non è compatibile conpip install -r requirments.txt
dovrebbe vedere

@shouldsee a cui requirments.txtti riferisci?
Phil

6

Vanilla setuptoolsnon supporta il download direttamente da un repository git ma è possibile utilizzare uno dei collegamenti di origine download da quella pagina, come:

easy_install http://github.com/mtai/python-gearman/tarball/master

Quindi, per essere sicuro che questa versione di python-gearman sia installata su qualsiasi server dove sarà il mio pacchetto, dovrò eseguire easy_install manualmente prima di installare il mio pacchetto?
andrei,

Se si utilizza easy_install, sì. Ma, come altri hanno sottolineato, è possibile passare a pipo buildoutche hanno una gestione dei requisiti più sofisticata. Vedi, ad esempio: pip.openplans.org/#requirements-files
Ned Deily,

In realtà, non è necessario eseguire manualmente easy_install; puoi semplicemente aggiungere il link extra a setup.py. Scriverò una risposta spiegando i dettagli.
PJ Eby,

2
Come menzionato nel mio commento sopra setup.py fornisce dependency_links che ti consente di scaricare da un repository
gti
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.