J'ai essayé de représenter graphiquement les packages installés en Python

résultat

-> Version du package PyPI Top 100: http://qiita.com/kitsuyui/items/a7cc56d476b59ff07f54

J'ai obtenu ce chiffre avec mon virtualenv pour l'apprentissage automatique. C'est évident en un coup d'œil.

dependencies.gv.png

Je pensais que numpy et scipy étaient tout aussi dépendants, Le scipy est moins dépendant ...

La difficulté du responsable est due au fait que de nombreux paquets en utilisent six pour rendre Python 3 et Python 2 compatibles.

Dans le reste des sections, pip freeze et pipdeptree, le script qui produit cette figure est détaillé.

pip freeze

python


$ pip freeze -l

Ensuite, vous pouvez voir les packages dans le virtualenv actuel. Cependant, comme il n'y a pas de hiérarchie et que tout est décrit à plat, cela sort dans une rangée et je ne comprends pas la dépendance.

autoflake==0.6.6
autopep8==1.1.1
flake8==2.2.4
graphviz==0.4.3
hacking==0.10.1
isort==3.9.6
matplotlib==1.4.3
mccabe==0.2.1
natsort==3.5.6
nose==1.3.6
numpy==1.9.2
pandas==0.16.0
pbr==0.10.8
pep8==1.5.7
pies==2.6.3
pipdeptree==0.4.2
py==1.4.26
pyflakes==0.8.1
pyparsing==2.0.3
pytest==2.7.0
python-dateutil==2.4.2
pytz==2015.2
scipy==0.15.1
six==1.9.0
Theano==0.7.0
tox==1.9.2
virtualenv==12.1.1

Utiliser pipdeptree

D'un autre côté, pipdeptree peut être utilisé pour afficher la hiérarchie des dépendances d'une manière facile à comprendre.

python


$ pipdeptree --nowarn --local-only --freeze --all
autoflake==0.6.6
  - pyflakes==0.8.1
autopep8==1.1.1
  - pep8==1.5.7
flake8==2.2.4
  - pyflakes==0.8.1
  - pep8==1.5.7
  - mccabe==0.2.1
graphviz==0.4.3
hacking==0.10.1
  - pyflakes==0.8.1
  - six==1.9.0
  - flake8==2.2.4
    - pyflakes==0.8.1
    - pep8==1.5.7
    - mccabe==0.2.1
  - pep8==1.5.7
  - mccabe==0.2.1
  - pbr==0.10.8
    - pip
isort==3.9.6
  - pies==2.6.3
  - natsort==3.5.6
matplotlib==1.4.3
  - nose==1.3.6
  - python-dateutil==2.4.2
    - six==1.9.0
  - pyparsing==2.0.3
  - six==1.9.0
  - pytz==2015.2
  - numpy==1.9.2
mccabe==0.2.1
natsort==3.5.6
nose==1.3.6
numpy==1.9.2
pandas==0.16.0
  - pytz==2015.2
  - python-dateutil==2.4.2
    - six==1.9.0
  - numpy==1.9.2
pbr==0.10.8
  - pip
pep8==1.5.7
pies==2.6.3
py==1.4.26
pyflakes==0.8.1
pyparsing==2.0.3
pytest==2.7.0
  - py==1.4.26
python-dateutil==2.4.2
  - six==1.9.0
pytz==2015.2
scipy==0.15.1
six==1.9.0
Theano==0.7.0
  - numpy==1.9.2
  - scipy==0.15.1
tox==1.9.2
  - virtualenv==12.1.1
  - py==1.4.26
virtualenv==12.1.1

Faisons un graphique.

J'ai décidé d'utiliser graphviz. Ce qui suit est un script qui transmet la sortie de pipdeptree comme entrée standard et la représente graphiquement avec graphviz. Comme mes autres articles, j'utilise Python 3.

graphout.py


# coding: utf-8
import re

import graphviz


def depfile_to_tree(file_like_object):
    line_pattern = re.compile(r'^(?:(?P<indent>(?:  )*)- )?'
                              r'(?P<pkg_name>.*?)'
                              r'(?:==(?P<version>.*?))?\n$')

    tree = []

    for line in file_like_object:
        matcher = line_pattern.match(line)
        indent, pkg_name, version = matcher.group('indent',
                                                  'pkg_name',
                                                  'version')

        if indent is None:
            hierarchy = 0
        else:
            hierarchy = int(len(indent) / 2)

        if hierarchy < len(tree):
            tree = tree[:hierarchy]

        tree.append((pkg_name, version))
        yield tuple(tree)


def main(pipdeptree_file):
    packages = set()
    dependencies = set()

    for package_tree in depfile_to_tree(pipdeptree_file):
        pkg_name = package_tree[-1][0]
        packages.add(pkg_name)
        if len(package_tree) < 2:
            continue
        parent, child = package_tree[-2:]
        dependencies.add((parent[0], child[0], child[1]))

    dot = graphviz.Digraph(comment='My Pip Dependencies')
    for p in packages:
        dot.node(p)

    for d in dependencies:
        dot.edge(*d)

    dot.engine = 'dot'
    dot.format = 'png'
    dot.render('dependencies.gv')

if __name__ == '__main__':
    import sys
    main(sys.stdin)

Comment utiliser

python


$ pipdeptree --nowarn --local-only --freeze --all > dependencies.txt
$ python graphout.py < dependencies.txt

Générez dependencies.gv et dependencies.gv.png.

De côté

pip ne résout pas les vraies dépendances. Il peut être résolu en utilisant pip-tools (pip-review) ou depsolver. Absent.

Recommended Posts

J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
J'ai essayé de simuler "Birthday Paradox" avec Python
J'ai essayé la méthode des moindres carrés en Python
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé d'implémenter le tri sélectif en python
Je veux afficher la progression en Python!
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé d'implémenter le poker de Drakue en Python
J'ai essayé d'implémenter GA (algorithme génétique) en Python
Je veux écrire en Python! (3) Utiliser des simulacres
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé de résoudre le problème avec Python Vol.1
Je veux utiliser le jeu de données R avec python
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
Python Open CV a essayé d'afficher l'image sous forme de texte.
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de toucher Python (installation)
Dans la commande python, python pointe vers python3.8
J'ai écrit la file d'attente en Python
J'ai essayé la notification de ligne en Python
J'ai essayé de déplacer le ballon
J'ai écrit la pile en Python
J'ai essayé d'estimer la section.
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé de programmer le test du chi carré en Python et Java.
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé de résumer les commandes souvent utilisées en entreprise
J'ai essayé d'énumérer les différences entre java et python
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé de résumer ce que l'homme fort de python fait dans le quartier des professionnels de la compétition
J'ai essayé de résumer la commande umask
J'ai essayé le mouvement Python3 qui change la direction dans le système de coordonnées
J'ai essayé de reconnaître le mot de réveil
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé d'utiliser l'optimisation bayésienne de Python