2010-05-20 10 views
21

Supongamos que el paquete python A requiere B, C y D; ¿hay alguna manera de listar A → B C D sin cargarlos?
Requires en los metadatos (yolk -M A) a menudo están incompletos, grr.
Uno puede descargar A.tar/A.egg, luego mirar a través de A/setup.py, , pero algunos de ellos son bastante sangrientos.enumera las dependencias del paquete python sin cargarlas?

(Yo habría pensado que conseguir al menos dependencias de primer nivel podría ser mecanizada; incluso una solución al 98% sería mejor que las descargas de avalanchas.)

Una pregunta relacionada: pip-upgrade-package-without-upgrading-dependencies

Respuesta

28

Snakefood

sfood -fuq package.py | sfood-target-files 

enumerará las dependencias.

`-f` tells sfood to follow dependencies recursively 
`-u` tells sfood to ignore unused imports 
`-q` tells sfood to be quiet about debugging information 

para filtrar los módulos de la librería estándar, se puede utilizar

sfood -fuq package.py | sfood-filter-stdlib | sfood-target-files 

Como ya ha señalado, si hay otros directorios que le gustaría que se ignora, también puede utilizar la sfood -I bandera.

+0

parece razonable, +1. sfoodxx -I /Library/...python2.6 (mac) no filtra las importaciones estándar sys, os.path etc.? – denis

+0

@Denis: use 'sfood-filter-stdlib' para eliminar entradas de la biblioteca estándar de Python. Editaré mi respuesta para incluir esto ... – unutbu

+1

sfood-filter-stdlib tiene '/ usr/lib/python' cableado en, y no funciona para sfood-imports. Pregunto al autor ... Bytheway Kevin Teague, "Quiero un pony" http://groups.google.com/group/django-developers/msg/5407cdb400157259 es una excelente reseña de los métodos de embalaje en 2008.) – denis

12

modulefinder de la lib estándar

Nuevo en la versión 2.3.

Este módulo proporciona una clase ModuleFinder que se puede utilizar para determinar el conjunto de módulos importados por una secuencia de comandos . modulefinder.py también puede ser ejecutar como una secuencia de comandos, dando el nombre de archivo de una secuencia de comandos de Python como su argumento, después de lo cual se imprimirá un informe de los módulos importados.

No estoy seguro si cumple con su requisito de no cargar los módulos. From here:

ModuleFinder inspección uso de código de bytes para encontrar dependencias, y por lo tanto es libre de efectos secundarios que pueden ser causados ​​por importar los módulos de ser estudiados.

Otros consejos sobre el uso de pylint o Gui2exe here

+2

modulefinder funciona, pero mostrará una gran cantidad de cosas inútiles y dependencias indirectas (dependencias que PUEDEN ser utilizadas por sus dependencias, pero en realidad no lo son). Puedes encontrar un script de ejemplo que hice usando el buscador de módulos aquí: https://gist.github.com/lrq3000/6175634 Y un script alternativo que usa un enfoque de análisis AST aquí (y que funciona mucho mejor para mí): https: // gist .github.com/lrq3000/6175522 – gaborous

5

Si por el paquete que quiere decir un paquete instalado PIP (y no un directorio con un __init__.py), entonces se puede usar el paquete Python llamada PIP . Por ejemplo:

def get_all_package_dependencies(): 
    """Return dictionary of installed packages to list of package dependencies.""" 
    return { 
     dist.key: [r.key for r in dist.requires()] 
     for dist in pip.get_installed_distributions() 
    } 
+0

Veo un paquete en la web y quiero saber su deps. Hay 'pip install --no-deps', luego cavar ... ¿o hay nuevos comandos pip para list-deps? (Los archivos de requisitos casi nunca están allí.) – denis

+0

y pprint se pueden usar para imprimir bastante la salida producida por el fragmento de arriba – binithb

Cuestiones relacionadas