Installazione dei pacchetti Python dalla cartella del file system locale a virtualenv con pip


346

È possibile installare pacchetti usando pip dal filesystem locale?

Ho corso python setup.py sdistper il mio pacchetto, che ha creato il file tar.gz appropriato. Questo file è archiviato sul mio sistema all'indirizzo /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 /srv/pkgposizione come un altro posto per pip per cercare se ho digitato pip install mypackage.


Stavo cercando di installare un pacchetto PyPi senza setup.py, dalla rotella WHL, e si è installato dopo aver scaricato una versione corretta per la mia versione di Python ed eseguito pip install <Path-to-WHL-file>.
Wiktor Stribiżew,

Risposte:


136

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

Potrebbe essere necessario generare un manichino index.htmlper l'indice del pacchetto locale che elenca i collegamenti a tutti i pacchetti. Questo strumento aiuta:

https://github.com/wolever/pip2pi


100
pip install mypackage --no-index --find-links file:///srv/pkg/mypackagedovrebbe funzionare.
jfs,

1
Aiuta. E possiamo usare l' opzione -i di pip per trattarlo come un PyPI locale.
diabloneo,

Il comando equivalente easy_install èeasy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
Wilfred Hughes il

Ho dovuto creare un file di distribuzione di origine non solo puntarlo alla directory di progetto o pacchetto prima che funzionasse. Questo mi ha fatto inciampare. docs.python.org/3.6/distutils/sourcedist.html
Josh

3
Si noti che --find-linksconsentirà comunque la ricerca su PyPI se il pacchetto non viene trovato nella posizione specificata o se è disponibile una versione più recente. Su Windows, trovo che combinare questo con --only-binary=packagename(o --only-binary=:all:) sia straordinariamente utile. Questo impedisce a pip di provare a scaricare eventuali pacchetti con dipendenze native che hanno solo distribuzioni di origine su PyPI (e quindi richiedono la compilazione), che è il motivo più comune che devo provare a installare da una directory. Diversamente --no-index, posso ancora installare altri pacchetti da PyPI.
jpmc26

463

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.

per esempio, pip install -e /srv/pkg

dove / srv / pkg è la directory di livello superiore in cui è possibile trovare 'setup.py'.


49
Questo installerà il pacchetto in modalità di sviluppo, il che significa che rimanderà a dove si trovano i sorgenti. Se per caso le fonti vengono spostate o eliminate, l'importazione del pacchetto fallirà.
Trasplazio Garzuglio,

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

3
Sebbene ciò sia corretto per l'installazione di un determinato pacchetto, in particolare uno in fase di sviluppo corrente / intensivo su un computer locale o URL VCS. Non risponde alla domanda sulla ricerca in una directory padre di tutte le origini di pacchetti locali anziché di una determinata fonte di pacchetti . La risposta accettata funziona quando si dispone di una directory o di un URL con più pacchetti da cui si desidera installare pip.
Gavin,

@MarcoDinacci Tuttavia, supponiamo che un utente scarichi il codice. Lo mettono dove vogliono che sia il programma, se sono così intelligenti. Perché dovrebbero volerlo spostare?
Zelphir Kaltstahl,

1
@Simon c'è un modo per dire a Pip di non cercare un repository git? Se do pip install -eeseguo il checkout del codice dal telecomando git, vorrei installare il codice così com'è (con le modifiche non ancora nel telecomando).
Pedru,

39

Sto installando pyfuzzyma non è in PyPI; restituisce il messaggio: No matching distribution found for pyfuzzy.

Ho provato la risposta accettata

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

Ma non funziona neanche e restituisce il seguente errore:

Ignorare gli indici: https://pypi.python.org/simple Raccogliere pyfuzzy Impossibile trovare una versione che soddisfi il requisito pyfuzzy (dalle versioni:) Nessuna distribuzione corrispondente trovata per pyfuzzy

Alla fine, ho trovato un modo semplice e semplice: 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

Quindi il seguente comando ha funzionato per me:

pip install ../pyfuzzy-0.1.0.tar.gz.

Spero che ti possa aiutare.


4
Questo ha funzionato per me. Ho provato gli altri approcci e sono inciampato per Could not find a version that satisfieserrore. Grazie.
Rair

21

Questa è la soluzione che ho finito usando:

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")

L'ho messo insieme da esempi di installazione di pip e dalla risposta di Rikard su un'altra domanda . L'argomento "--pre" consente di installare versioni non di produzione. L'argomento "--no-index" evita di cercare gli indici PyPI. "--Find-links =." ricerche di argomenti nella cartella locale (può essere relativa o assoluta). Ho usato gli argomenti "--log-file", "log.txt" e "-vv" per il debug. L'argomento "--upgrade" consente di installare versioni più recenti rispetto a quelle precedenti.

Ho anche trovato un buon modo per disinstallarli. Ciò è utile quando si hanno diversi ambienti Python diversi. È lo stesso formato di base, basta usare "disinstalla" invece di "installa", con una misura di sicurezza per prevenire disinstallazioni indesiderate:

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 contiene questi file: install.py, uninstall.py, mypackagename-1.0.zip


1
Grazie. "--Find-links =." e "--no-index", dove la chiave per incollare uno script Python all'interno del mio pacchetto di utilità, che rimuove prima il pacchetto della versione precedente dai pacchetti del sito, quindi installa un pacchetto tar.gz da un sottodir della cartella-pacchetto-utility (non sapeva di --find-links =.), quindi crea la ruota e la installa. Tutto automatizzato tramite piombo e clic. Se qualcuno lo desidera, posterò un link. Upvoted.
JackLeEmmerdeur

15

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

È possibile inserire archivi di pacchetti in alcune cartelle e prendere quello più recente senza modificare il file dei 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.txtput:

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

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

In questo modo è possibile installare i pacchetti da local folderAND pypicon la stessa chiamata singola:pip install -r requirements/production.txt

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


Grazie, è persino meglio di quello che stavo pensando di fare!
Trovato il

11

Dalla pagina dei pacchetti di installazione puoi semplicemente eseguire:

pip install / srv / pkg / mypackage

dove / srv / pkg / mypackage è la directory, contenente setup.py .


Inoltre 1 , è possibile installarlo dal file di archivio:

pip install ./mypackage-1.0.4.tar.gz

1 Anche se notato nella domanda, a causa della sua popolarità, è anche incluso.


2
Questa dovrebbe essere la risposta predefinita. Non c'è bisogno di cercare pip con --find-links se sai esattamente dove si trova il tuo pacchetto sul computer locale.
Robert,

6

Supponendo di avere virtualenv e un requirements.txtfile, è possibile definire all'interno di questo file dove ottenere i pacchetti:

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge

5

Avere requisiti in requirements.txte egg_dircome directory

puoi costruire la tua cache locale:

$ pip download -r requirements.txt -d eggs_dir

quindi, usare quella "cache" è semplice come:

$ pip install -r requirements.txt --find-links=eggs_dir


1

Per installare solo da locale sono necessarie 2 opzioni:

  • --find-links: dove cercare dipendenze. Non è necessario il file://prefisso menzionato da altri.
  • --no-index: non cercare negli indici pypi le dipendenze mancanti (dipendenze non installate e non nel --find-linkspercorso).

Quindi è possibile eseguire da qualsiasi cartella il seguente:

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

Se il tuo mypackage è configurato correttamente, elencherà tutte le sue dipendenze e se hai usato pip download per scaricare la cascata di dipendenze (cioè dipendenze di dipendenze ecc.), Tutto funzionerà.

Se si desidera utilizzare l'indice pypi se è accessibile, ma il fallback alle ruote locali in caso contrario, è possibile rimuovere --no-indexe aggiungere --retries 0. Vedrai pip in pausa per un po 'mentre sta provando a controllare pypi per una dipendenza mancante (una non installata) e quando trova che non può raggiungerla, tornerà al locale. Non sembra esserci un modo per dire a Pip di "cercare prima quelli locali, poi l'indice".


-1

Ho cercato di ottenere qualcosa di veramente semplice e fallito miseramente, probabilmente sono stupido.

Ad ogni modo, se hai uno script / Dockerfileche scarica un file zip del pacchetto python (ad es. Da GitHub) e vuoi installarlo puoi usare il file:///prefisso per installarlo come mostrato nel seguente esempio :

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

NOTA : so che è possibile installare subito il pacchetto usando, pip install https://example.com/mypackage.zipma nel mio caso volevo verificare il checksum (mai abbastanza paranoico) e ho fallito miseramente quando ho provato ad usare le varie opzioni che pip fornisce / il #md5frammento.

È stato sorprendentemente frustrante fare qualcosa di così semplice direttamente con pip. Volevo solo passare un checksum e pipverificare che lo zip corrispondesse prima di installarlo.

Probabilmente stavo facendo qualcosa di molto stupido, ma alla fine ho rinunciato e ho optato per questo. Spero che aiuti gli altri a provare a fare qualcosa di simile.

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.