2013-02-22 16 views
173

È possibile installare pacchetti usando pip dal filesystem locale?Installare pacchetti Python dalla cartella del file system locale con pip

Ho eseguito python setup.py sdist per il mio pacchetto, che ha creato il file tar.gz appropriato. Questo file è memorizzato sul mio sistema a /srv/pkg/mypackage/mypackage-0.1.0.tar.gz.

Ora in un ambiente virtuale vorrei installare pacchetti provenienti da Pypi o dalla posizione locale specifica /srv/pkg.

È possibile?

PS So che posso specificare pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz. Funzionerà, ma sto parlando di usare la posizione /srv/pkg come un altro posto dove cercare pip se ho digitato pip install mypackage.

+0

stavo cercando di installare un pacchetto Cheese Shop, senza setup.py, dalla ruota WHL, e ha ottenuto installato dopo aver scaricato una versione corretta per la mia versione di Python, ho eseguito 'pip install '. –

+0

Correlati: [Come convogliare i pacchetti di installazione in base a requirements.txt da una directory locale?] (Http://stackoverflow.com/q/7225900/95735) –

risposta

74

Sono abbastanza sicuro che quello che stai cercando si chiama --find-links opzione.

Anche se potrebbe essere necessario generare un dummy index.html per l'indice del pacchetto locale che elenca i collegamenti a tutti i pacchetti. Questo strumento consente di:

https://github.com/wolever/pip2pi

+47

'pip install mypackage --no-index --find-links file: /// srv/pkg/mypackage' dovrebbe funzionare. – jfs

+0

Che funziona. Non è l'ideale, ma è abbastanza buono. Grazie. – chadgh

+1

Aiuta. E possiamo usare l'opzione * -i * di pip per trattarla come un PyPI locale. – diabloneo

290

Che dire ::

pip install --help 
... 
    -e, --editable <path/url> Install a project in editable mode (i.e. setuptools 
           "develop mode") from a local project path or a VCS url. 

ad esempio, pip install -e /srv/pkg

dove/srv/pkg è la directory di livello superiore, dove 'setup.py' può essere trovato.

+28

Questo installerà il pacchetto in modalità sviluppo, il che significa che si collegherà solo a dove le fonti sono Se per caso le sorgenti vengono spostate o eliminate, l'importazione del pacchetto fallirà. –

+2

@MarcoDinacci La cosa interessante di '--editable' è che sembra guardare nella directory del pacchetto locale e impostare il sorgente come un repo git se ce n'è uno - un po 'più flessibile di una semplice cartella. Non riesco a trovare la documentazione per questo però. – Simon

+0

Funziona bene anche su Windows. Dovrebbe essere la risposta accettata. – miguelr

17

Questa è la soluzione che ho finito per usare:

import pip 


def install(package): 
    # Debugging 
    # pip.main(["install", "--pre", "--upgrade", "--no-index", 
    #   "--find-links=.", package, "--log-file", "log.txt", "-vv"]) 
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package]) 


if __name__ == "__main__": 
    install("mypackagename") 
    raw_input("Press Enter to Exit...\n") 

ho ricostruito questo insieme da pip install examples come pure da Rikard's answer su another question. L'argomento "--pre" ti consente di installare versioni non di produzione. L'argomento "--no-index" evita di cercare gli indici PyPI. Il "--find-links =." ricerca di argomenti nella cartella locale (questa può essere relativa o assoluta). Ho usato gli argomenti "--log-file", "log.txt" e "-vv" per il debug. L'argomento "--upgrade" ti consente di installare le versioni più recenti su quelle più vecchie.

Ho trovato anche un buon modo per disinstallarli. Questo è utile quando si hanno diversi ambienti Python. E 'lo stesso formato di base, usando solo "disinstallare" invece di "installazione", con una misura di sicurezza per evitare che disinstallazioni non intenzionali:

import pip 


def uninstall(package): 
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package) 
    if "y" in response.lower(): 
     # Debugging 
     # pip.main(["uninstall", package, "-vv"]) 
     pip.main(["uninstall", package]) 
    pass 


if __name__ == "__main__": 
    uninstall("mypackagename") 
    raw_input("Press Enter to Exit...\n") 

La cartella locale contenente i file: install.py, uninstall.py, mypackagename- 1.0.zip

+1

Grazie. Il "--find-links =." e "--no-index", dove la chiave per incollare uno script python all'interno del mio pacchetto di utilità, che prima rimuove il pacchetto old-version-from dai pacchetti del sito, quindi installa un pacchetto tar.gz'ed da una sottodirectory della cartella del pacchetto di utilità (non sapeva di --find-links =.), quindi crea la ruota e la installa. Tutto automatizzato tramite plumbum e clic. Se qualcuno lo vuole, posterò un link. Upvoted. – user3469861

15

Sto installando pyfuzzy. Non è in PyPI, "Nessuna distribuzione corrispondente trovata per pyfuzzy". Tuttavia, provo la risposta accettata

pip install --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy 

Non può funzionare altrettanto bene.Il risultato è:

indici Ignorando: https://pypi.python.org/simple Raccolta pyfuzzy Impossibile trovare una versione che soddisfa la pyfuzzy requisito (dalle versioni:) Nessuna distribuzione di corrispondenza trovata per pyfuzzy

Finalmente, ho trovare un semplice buon modo. https://pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file. 
$ pip install ./downloads/SomePackage-1.0.4.tar.gz 
$ pip install http://my.package.repo/SomePackage-1.0.4.zip 

pip install ../pyfuzzy-0.1.0.tar.gz. Ora funziona bene. Spero ti aiuti.

1

Un'opzione --find-links fa il lavoro e funziona dal file requirements.txt!

Si può mettere archivi dei pacchetti in qualche cartella e prendere quello più recente senza modificare il file requisiti, ad esempio requirements:

. 
└───requirements.txt 
└───requirements 
    ├───foo_bar-0.1.5-py2.py3-none-any.whl 
    ├───foo_bar-0.1.6-py2.py3-none-any.whl 
    ├───wiz_bang-0.7-py2.py3-none-any.whl 
    ├───wiz_bang-0.8-py2.py3-none-any.whl 
    ├───base.txt 
    ├───local.txt 
    └───production.txt 

Ora in requirements/base.txt put:

--find-links=requirements 
foo_bar 
wiz_bang>=0.8 

Un modo pulito per aggiornare i pacchetti proprietari, basta rilasciarne uno nuovo nella cartella

In questo modo è possibile installare pacchetti da local folder E pypi con la stessa chiamata singola: pip install -r requirements/production.txt

PS. Vedere il mio fork cokiecutter-djangopackage per vedere come dividere i requisiti e utilizzare l'organizzazione dei requisiti basata su cartelle.

25

Questo è molto semplice. Il comando che serve è:

pip install -e <DIRECTORY> 

Nota che la directory mosto ha un file setup.py in esso

Problemi correlati