2010-05-20 14 views
21

Dites que le paquet python A nécessite B, C et D; Y at-il un moyen de lister A → B C D sans les charger?
Requires dans les métadonnées (yolk -M A) sont souvent incomplètes, grr.
On peut télécharger A.tar/A.egg, puis regarder A/setup.py, mais certains d'entre eux sont assez gores.liste les dépendances du paquet python sans les charger?

(j'aurais pensé que l'obtention d'au moins les dépendances de premier niveau pourrait être mécanisée, même une solution à 98% serait mieux que les téléchargements avalancheuses.)

Une question connexe: pip-upgrade-package-without-upgrading-dependencies

Répondre

28

Snakefood

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

listera les dépendances.

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

Pour filtrer les modules de la bibliothèque standard, vous pouvez utiliser

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

Comme vous l'avez déjà remarqué, s'il y a d'autres répertoires que vous aimeriez ignorés, vous pouvez également utiliser le sfood -I drapeau.

+0

semble raisonnable, +1. sfoodxx -I /Library/...python2.6 (mac) ne filtre pas les imports standards sys, os.path etc. – denis

+0

@Denis: Utilisez 'sfood-filter-stdlib' pour supprimer les entrées de la bibliothèque standard Python. Je vais éditer ma réponse pour inclure ceci ... – unutbu

+1

Le fichier sfood-filter-stdlib contient le fichier '/ usr/lib/python', et ne fonctionne pas pour sfood-imports. Je demande à l'auteur ... Bytheway Kevin Teague, "Je veux un poney" http://groups.google.com/group/django-developers/msg/5407cdb400157259 est un aperçu exceptionnel des méthodes d'emballage en 2008.) – denis

12

modulefinder de la lib norme

Nouveau dans la version 2.3.

Ce module fournit une classe ModuleFinder qui peut être utilisé pour déterminer l'ensemble des modules importés par un script . module1.py peut aussi être exécuté en tant que script, en donnant le nom de fichier d'un script Python comme argument, après quoi un rapport des modules importés sera imprimé.

Je ne suis pas sûr s'il est conforme à votre requierement de ne pas charger les modules. From here:

modulefinder utilisation inspection bytecode pour trouver les dépendances, et est donc sans effets secondaires qui peuvent être causés par l'importation des modules étant étudiés.

D'autres conseils sur l'utilisation de pylint ou Gui2exe here

+2

fonctionne mais il montrera beaucoup de choses inutiles et de dépendances indirectes (dépendances qui PEUVENT être utilisées par vos dépendances, mais qui ne le sont pas). Vous pouvez trouver un exemple de script que j'ai fait en utilisant modulefinder ici: https://gist.github.com/lrq3000/6175634 Et un script alternatif utilisant une approche d'analyse syntaxique AST ici (et qui fonctionne bien mieux pour moi): https: // gist .github.com/lrq3000/6175522 – gaborous

5

Si par le paquet que vous voulez dire un paquet de pépin installé (et non un répertoire avec un __init__.py), vous pouvez utiliser le package Python appelé pip . Par exemple:

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

Je vois un paquet sur le web et je veux connaître ses débits. Il y a 'pip install --no-deps', puis creusez ... ou y a-t-il des commandes pip plus récentes pour les listpsps? (Les fichiers d'exigences sont le plus souvent simplement pas là.) – denis

+0

et pprint peut être utilisé pour imprimer la sortie produite par l'extrait ci-dessus – binithb