2016-06-15 16 views
8

Con "pip freeze" otterrò un elenco di nomi di pacchetti. es .:Elenco di nomi di importazione effettivi in ​​python

Django==1.9.7 
psycopg2==2.6.1 
djangorestframework==3.3.3 
djangorestframework-jwt==1.8.0 
django-rest-swagger==0.3.7 
django-environ==0.4.0 
python-dateutil==2.5.3 
django-sendfile==0.3.10 

C'è un modo per ricevere un elenco di nomi reali per import? per esempio. invece di djangorestframework =>rest_framework

+0

Prova 'list' pip. Questo potrebbe essere che stavi cercando. –

+3

@RahulKP che ti dà il nome del pacchetto, ma * non * necessariamente la cosa che devi importare. – jonrsharpe

+0

Non è in nome del modulo reale memorizzato in C: \ Python27 \ Lib \ site-packages (windows) –

risposta

3

Sì, top_level.txt sarà un modulo corretto nome. È possibile utilizzare il modulo pkg_resources per estrarre i metadati dai pacchetti.

codice Python per questo:

import pkg_resources 


def read_requirements(requirements_file): 
    with open(requirements_file, 'r') as f: 
     return f.read().splitlines() 


def get_package_name(package): 
    return list(pkg_resources.get_distribution(package)._get_metadata('top_level.txt'))[0] 


requirements = read_requirements('/path/to/requirements.txt') 
packages = [get_package_name(p) for p in requirements] 
6

È possibile utilizzare il modulo standard pkgutil per ottenere l'elenco delle importazioni di alto livello come questo:

import pkgutil 
list(pkgutil.iter_modules()) 

che troverà solo moduli che vivono in file regolari, file zip o un altro caricatore che supporta l'enumerazione dei moduli. Dovrebbe essere la maggior parte di loro su un sistema standard.

Il risultato è un elenco di 3 tuple, con il caricatore, il nome del modulo e se si tratti di un singolo modulo o di un pacchetto. Se siete interessati solo il nome del modulo, fare semplicemente:

list(item[1] for item in pkgutil.iter_modules()) 
1

Un altro modo è quello di guardare la prima linea di questo file:

# If output of pip freeze is djangorestframework==3.3.3 
# Then your dir prefix becomes "djangorestframework-3.3.3" 

../lib/python2.7/site-packages/<dir-prefix>.dist-info/top_level.txt 

# e.g. 
../lib/python2.7/site-packages/djangorestframework-3.3.3.dist-info/top_level.txt 
Problemi correlati