2009-04-02 8 views
98

Molti moduli Python di terze parti dispongono di un attributo che contiene le informazioni sulla versione per il modulo (in genere qualcosa come module.VERSION o module.__version__), tuttavia alcuni non lo fanno.Controllo di una versione del modulo Python in fase di esecuzione

Particolari esempi di tali moduli sono libxslt e libxml2.

Ho bisogno di verificare che la versione corretta di questi moduli sia utilizzata in fase di esecuzione. C'è un modo per fare questo?

Una potenziale soluzione potrebbe essere quella di leggere l'origine in fase di esecuzione, cancellarla e quindi confrontarla con l'hash della versione nota, ma è brutto.

Esiste una soluzione migliore?

risposta

7

Mi piacerebbe stare lontano dall'hashing. La versione di libxslt in uso potrebbe contenere un tipo di patch che non influisce sul tuo utilizzo.

In alternativa, mi piacerebbe suggerire di non verificare in fase di esecuzione (non so se questo è un requisito difficile o no). Per la roba di Python scrivo che ha dipendenze esterne (librerie di terze parti), scrivo uno script che gli utenti possono eseguire per controllare la loro installazione python per vedere se sono installate le versioni appropriate dei moduli.

Per i moduli che non hanno un attributo 'versione' definito, è possibile esaminare le interfacce che contiene (classi e metodi) e verificare se corrispondono all'interfaccia che si aspettano. Quindi nel codice effettivo su cui stai lavorando, supponi che i moduli di terze parti abbiano l'interfaccia che ti aspetti.

7

Alcune idee:

  1. Prova a controllare per le funzioni che esistono o non esistono nelle versioni necessarie.
  2. Se non ci sono differenze di funzione, controllare gli argomenti e le firme della funzione.
  3. Se non riesci a capirlo dalle firme delle funzioni, imposta alcune stub al momento dell'importazione e controlla il loro comportamento.
213

Utilizzare pkg_resources. Qualunque cosa sia installata da PyPI almeno dovrebbe avere un numero di versione.

>>> import pkg_resources 
>>> pkg_resources.get_distribution("blogofile").version 
'0.7.1' 
+8

Si noti inoltre che il nome del pacchetto deve essere quello della voce PyPI. Quindi qualcosa come "pkg_resources.get_distribution ('MySQLdb'). Version" non funzionerà ma "pkg_resources.get_distribution ('mysql-python'). – Rahul

+1

Se si sta eseguendo con un nome di file assoluto, 'pkg_resources' potrebbe prelevare una versione diversa che ombreggia quella che si sta effettivamente eseguendo perché ha una precedenza più alta su' PYTHONPATH' o simile. – tripleee

+3

Nel caso qualcuno voglia sapere come realizzare l'attributo '__version__': http://stackoverflow.com/q/17583443/562769 –

2

È possibile utilizzare

pip freeze 

per vedere i pacchetti installati in formato requisiti.

Problemi correlati