IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

exécuter code graphviz avec script perl ?


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut exécuter code graphviz avec script perl ?
    Bonjour,

    Je suis actuellement en stage et voilà mon soucis.
    J'ai un script perl qui traite un fichier texte et qui grâce à ces infos, me génère un code graphviz (mêmes plusieurs dans un dossier).

    Le problème est que j'aimerais faire exécuter ces codes automatiquement à travers le script perl, afin d'enregistrer les images en .jpeg dans autre un dossier. Le but étant d'éviter de le faire de l'interface graphviz.

    J'ai télécharger la librairie Tk::GraphViz mais je ne suis pas plus aidée pour autant.

    Si quelqu'un pouvait m'aider !!!!
    Merci d'avance.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Comment crées tu ton code graphiz, via perl ? Peux tu nous montrer ton code ?

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oui tout à fait, au fur et à mesure du traitement je fais des print dans le fichier GRAPH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     open (GRAPH, ">$input_path"."\\graphiques\\"."$CR_id")|| die "We can not open this file.";
    print GRAPH "digraph g {\n node [fontname = \"arial\", fontsize = \"14\", shape = \"record\"];\n";
    print GRAPH "subgraph central {\n \"CR_central\" [color = \"orangered1\", label = \"$CR_id \\n $CR_release \\n $CR_status \\n $CR_func \\n $CR_type\", style = \"bold\"]; \n }\n";
    $size_child = @CR_child;
        if ($size_child == 1 && $CR_child[0] eq $void){}
        else{
            
            print GRAPH "subgraph child { \n node [color = \"limegreen\"];\n";
            foreach $child (@CR_child) {
                if ($child ne $void){
                    &process();
                    print GRAPH "\"$child\" [label = \"$child \\n $CR_release \\n $CR_status \\n $CR_func \\n $CR_type\"];\n";
                }
            }
            print GRAPH "}\n";
        }
    .....
    Voila un bout du code perl qui me crée le code graphviz et j'obtiens un des codes graphviz suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    digraph g {
     node [fontname = "arial", fontsize = "14", shape = "record"];
    subgraph central {
     	"CR_central" [color = "orangered1", label = "aaaaa \n bbb \n cccc \n ddddd \n eeeee", style = "bold"]; 
     }
    subgraph child { 
     node [color = "limegreen"];
    "ffff" [label = "fffff \n gggg \n cccc \n \hhhh \n tttt"];
    }
    subgraph parent { 
     node [color = "limegreen"];
    "llll" [label = "llll \n bbbb \n cccc \n bbbb \n jjjj"];
    }
    subgraph {
     rank = same; CR_central; 
    }
    "CR_central" -> "fffff" [color = "limegreen"];
    "lllll" -> "CR_central" [color = "limegreen"];
    }
    Et mon problème est de faire exécuter ce dernier code automatiquement à travers le script perl, sans avoir à le faire manuellement dans graphviz (c'est à dire ouvrir graphviz, ouvrir le code, et le lancer) car il y aurai environ 650 graphiques à lancer !!!

    Pouvez vous m'aider ?

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Voilà quelques idées :
    1. Il serait peut être beaucoup plus propre de générer ton code graphivz en utilisant un module perl. Il existe le module GraphViz qui te permet de créer tes nœuds et autres via des méthodes propres au lieu d'utiliser des print. Et par la suite, il est hyper simple d'en générer une image à un format voulu en une ligne de code.
    2. Si tu ne souhaites pas réécrire ton code en utilisant ce module (que je te recommande tout de même), tu peux également lancer des commandes systèmes qui lanceront l'exécutable de graphviz pour générer tes images. Il te faut ainsi connaitre la commande adéquate à lancer. si tu ne la connais pas, tu peux l'avoir depuis graphviz quand tu génères ton codes. Je crois qu'elle est de ce type (mais tu dois mieux maitriser que moi) :
      "C:/Program Files/Graphviz2.26.3/bin/dot.exe" -Tgif -o"MonImage.gif" -Kdot
    3. Autre solution : Chercher s'il existe un module permettant de charger tes fichiers .dot à la volée et de créer les images. Mais je n'ai personnellement pas trouvé de modules.


    Pour te convaincre que la solution 1 est la plus simple, efficace et propre, voici un exemple de code qui fonctionne, il crée une image équivalente à ton code graphviz que tu nous as montré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #!/usr/bin/perl
    use strict;
    use warnings;
    use GraphViz;
     
    my $graph = GraphViz->new(
      node => {
        shape    => 'box',
        fontname => 'arial',
        fontsize => '14',
        shape    => 'record'
      }
    );
     
    $graph->add_node(
      'CR_central',
      label => 'aaaaa \n bbb \n cccc \n ddddd \n eeeee',
      color => 'orangered1',
      style => 'bold',
    );
     
    $graph->add_node('ffff');
    $graph->add_node('llll');
    $graph->add_node(
      'ffff2',
      label => 'fffff \n gggg \n cccc \n \hhhh \n tttt',
      color => 'limegreen'
    );
    $graph->add_node(
      'llll2',
      label => 'llll \n bbbb \n cccc \n bbbb \n jjjj',
      color => 'limegreen'
    );
     
    $graph->add_edge(
      'llll'  => 'CR_central',
      'color' => 'limegreen',
    );
    $graph->add_edge(
      'CR_central' => 'ffff',
      'color'      => 'limegreen',
    );
     
    # Creation d'une image
    my $image_file = "$input_path/graphiques/$CR_id";
    open( my $fh_image, '>', $image_file ) or die("Impossible de creer l'image $image_file\n");
    binmode $fh_image;
    print {$fh_image} $graph->as_png;
    close($fh_image);
    Voici l'image résultante, c'est simple non ? Il te suffit juste d'installer le module GraphViz comme expliqué dans notre FAQ Perl.
    Images attachées Images attachées  

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Est ce qu'au lieu d'afficher l'image, on peut l'enregistrer dans un dossier ?

    Et enfin est ce que vous auriez un document ou un lien vers un site avec les principales méthodes de la librairie Graphviz car j'en ai cherché tout hier et je me suis perdue à force.

    Mais je vais suivre la première option se sera certainement la plus simple, du moins j'espère.

    Je me mets au boulot et je vous tiendrai au courant plus tard de mon avancement.

    En attendant merci beaucoup !!!!!!!!

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oups j'ai parlé trop vite !!
    J'ai fait exécuter le code que vous m'avez fourni mais j'ai un problème. Voici l'erreur qui m'est retournée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't locate object method "new" via package "GraphViz" (perhaps you forgot to load "GraphViz"?)
    Alors je ne comprends pas car j'ai les fichiers GraphViz.pm, parseRecordLabel.pm et Reaper.pm.
    Peut être que je n'ai pas le bon module ????

    Si vous pouvez quelque chose pour moi merci.

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Le code que je vous ai mis au dessus fait exactement ce que vous voulez. Il vous suffit de le tester chez vous. Il créer un fichier image (ne l'ouvre pas). Vous pouvez le créer dans n'importe quel dossier de votre choix.

    En ce qui concerne la documentation du module Perl GraphViz, je vous ai mis le lien dans mon message précédent. Je vous le remets : GraphViz (c'est le module GraphViz).

    Pour la documentation officielle du logiciel GraphViz, faut voir le site.

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par Caro81 Voir le message
    Oups j'ai parlé trop vite !!
    J'ai fait exécuter le code que vous m'avez fourni mais j'ai un problème. Voici l'erreur qui m'est retournée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't locate object method "new" via package "GraphViz" (perhaps you forgot to load "GraphViz"?)
    Alors je ne comprends pas car j'ai les fichiers GraphViz.pm, parseRecordLabel.pm et Reaper.pm.
    Peut être que je n'ai pas le bon module ????

    Si vous pouvez quelque chose pour moi merci.
    Avez vous installé le module graphViz et comment ?

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ok Ok c'est bon !!!
    Merci beaucoup !!!
    J'ai re-télécharger le module qui va bien et j'arrive donc à générer le code exemple que vous m'avez envoyé.

    En revanche en essayant de l'insérer dans mon code perl je n'arrive pas à faire afficher plusieurs liens.
    Enfin pour être claire, je fais dérouler une liste et le code est scencé me créer un 'node' et un 'edge' pour chaque élément de la liste or celui-ci ne me crée qu'un seul 'node' (le dernier de la liste) et tous les 'edge'.

    Voici le code perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    foreach $c (@C) {
                if ($c ne $void){ #$void = "<void>"
                    &process();
        	             $graph->add_node(
      		'$c',
      		label => $c." \n ".$a." \n ".$b." \n ".$d." \n ".$e,
      		color => 'limegreen'
    		);
    #CETTE PARTIE NE ME CREE QU'UN SEUL 'NODE'
    		$graph->add_edge(
      		'CR_central'  => '$c',
      		'color' => 'limegreen',
    		);
    #CETTE PARTIE ME CREE TOUS LES 'EDGE' CE QUI FAIT QUE J'AI 10 LIENS QUI PARTENT DE CR_CENTRAL MAIS QUI ARRIVENT AU MEME 'NODE' AU LIEU DE 10 NODES   
    	             }
               }

    Je ne comprends pas pourquoi.
    Vous pouvez m'aider ?
    Si c'est pas clair demandez moi, n'hésitez pas.
    Merci

  10. #10
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Après réflexion, ce problème est peut être un problème de supperposition des 'node' mais je ne sais pas pour autant le régler.

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Il faut revoir les notions de Perl car tu te mélanges les pinceaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $graph->add_node(
      		'$c', # MAUVAISE ECRITURE
      		label => $c." \n ".$a." \n ".$b." \n ".$d." \n ".$e,
      		color => 'limegreen'
    		);
    veut dire que ton node s'appelera $c, or je suppose que tu souhaites que ton node s'appelle "le contenu de $c", donc tu dois écrire
    Les simples quote annulent l'interpolation de la variable.

    Donc Ton code doit ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    foreach $c (@C) {
                if ($c ne $void){ #$void = "<void>"
                    &process();
        	             $graph->add_node(
      		"$c",
      		label => $c." \n ".$a." \n ".$b." \n ".$d." \n ".$e,
      		color => 'limegreen'
    		);
     
    		$graph->add_edge(
      		'CR_central'  => "$c",
      		'color' => 'limegreen',
    		);
     
    	             }
               }
    Tu n'avais qu'un seul node car par défaut les noms des nodes sont uniques et vu que l'unique nom était $c, tout s'écrasé.

  12. #12
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci, j'essayerai ça demain au bureau.

    Maintenant que vous me le rappelez c'est vrai qu'il y a une différence entre les simples et les doubles quotes mais cela fait un petit moment que je suis sur ce script et à force je m'embrouille.

    Merci beaucoup je vous tiens au courant demain.

  13. #13
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Vraiment merci beaucoup djibril pour tes conseils et ta patience.
    Je suis arrivée à tout faire marcher. C'est super.
    Merci merci merci.
    Bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Apache perd le lien avec script Perl
    Par ZebreLoup dans le forum Web
    Réponses: 0
    Dernier message: 07/12/2012, 14h57
  2. Exécution périodique d'un script Perl
    Par zinehom dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2012, 21h39
  3. Ouvrir Firefox avec script Perl
    Par ash_rmy dans le forum Apache
    Réponses: 17
    Dernier message: 29/08/2009, 22h09
  4. Empecher la visualisation du code d'un script PERL
    Par TigreRouge dans le forum Langage
    Réponses: 33
    Dernier message: 20/03/2006, 18h04
  5. probleme avec script perl grab_tv_fr.pl
    Par ZiMo dans le forum Langage
    Réponses: 6
    Dernier message: 30/11/2005, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo