2013-06-24 7 views
10

Supponendo che nella distribuzione python sia già installato pip o easy_install, mi piacerebbe sapere come posso installare un pacchetto richiesto nella directory utente all'interno dello script stesso.Come installare un pacchetto Python mancante all'interno dello script che ne ha bisogno?

Da quello che so PIP è anche un modulo python quindi la soluzione dovrebbe essere simile:

try: 
    import zumba 
except ImportError: 
    import pip 
    # ... do "pip install --user zumba" or throw exception <-- how? 
    import zumba 

che cosa manco sta facendo "PIP installare --user zumba" da dentro pitone, non lo faccio voglio farlo usando os.system() in quanto ciò potrebbe creare altri problemi.

suppongo che sia possibile ...

+1

Che ne dite di questa soluzione: http://stackoverflow.com/questions/12332975/installing-python-module-within-code –

+2

Penso che questo sarebbe molto pratica di codifica indesiderata al di fuori dello script di installazione. Io (come immagino la maggior parte delle persone) non mi piacerebbe/confido che qualsiasi programma che eseguo cambi il mio ambiente. Strumenti come pip e virtualenv sono specificamente lì in modo che l'utente abbia il controllo di quale pacchetto è installato su quale versione. Non è un esperto di distutils, ma so che ha le strutture per elencare i prerequisiti per qualsiasi pacchetto. Se è solo per uso personale potresti probabilmente scrivere un po 'di quel codice. – Joop

+0

Grazie ragazzi, funziona perfettamente. Come nota, questa è una buona soluzione per script standalone, non per moduli/pacchetti. – sorin

risposta

14

Grazie a @Joop sono stato in grado di venire-up con la risposta corretta.

try: 
    import zumba 
except ImportError: 
    import pip 
    pip.main(['install', '--user', 'zumba']) 
    import zumba 

Un'altra osservazione importante è che questo funzionerà senza richiedere l'accesso di root come sarà installare il modulo nella directory utente.

Non so se funzionerà per moduli binari o quelli che richiederebbero la compilazione, ma funziona chiaramente bene per i moduli pure-python.

Ora è possibile scrivere script autonomi e non preoccuparsi delle dipendenze.

+0

Questo ha funzionato per me per installare 'boto3' sul servizio PythonAnywhere. Sembra che pip.main() sia solo un wrapper attorno allo strumento della riga di comando, piuttosto che offrire un'API. Gentile brutto, ma funzionale, suppongo. Stavo ricevendo un messaggio di "accesso negato", fino a quando ho aggiunto "--user". –

1

Desidero notare che la risposta corrente accettata potrebbe causare una possibile collisione tra nomi di app. L'importazione dallo spazio dei nomi dell'app non ti dà l'immagine completa di ciò che è installato sul sistema.

Un modo migliore sarebbe:

import pip 

packages = [package.project_name for package in pip.get_installed_distributions()] 

if 'package' not in packages: 
    pip.main(['install', 'package']) 
Problemi correlati