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

Web Perl Discussion :

CGI R et Perl


Sujet :

Web Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut CGI R et Perl
    Bonjour à tous,

    J'ai un CGI sur mon serveur Linux (Ubuntu server) qui devrait se charger de sortir un graphique généré par R avec des données récupérées dans MySQL en fonction de paramètres saisis dans une interface web. Or le graphique n'est pas créé.

    Il n'y a pas de message d'erreur de le log d'erreur d'Apache.
    Lorsque je lance les lignes de commandes relatives à R en console sur le serveur, il n'y a pas de message d'erreur et le graphique est créé (aussi bien en root qu'en simple utilisateur).

    Voici les lignes de mon script 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
    use Statistics::R;
    my $R = Statistics::R->new();
    $R->startR;	
     
    my $i = 0;
    my @pourcentage;
    foreach (@data) {
    	push @pourcentage, $data[$i][0];
    	$i++;
    }
     
    $R->send('pc<- c ('. join(",", @pourcentage). ')');
    $R->send('png("/home/www-data/test/essai.png")');
    $R->send('plot(pc)');
    $R->send('dev.off()');
    Quelqu'un a une idée du problème ?

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut
    En tapant la commande suivante en console on peut remarquer que les droits de R sont les suivants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -rwxr-xr-x 1 root root 7979 2010-01-18 16:31 R
    Est-ce que mon problème ne serait pas lié aux droits des fichiers exécutables ? Je vais regarder la doc de Hugo ETIEVANT sur les droits étendus...

  3. #3
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    Est-ce que mon problème ne serait pas lié aux droits des fichiers exécutables ?
    La première des choses est de vérifier que Perl et R ont les droits d'écriture et de lecture dans le répertoire qui est utilisé pour faire le pont entre les deux langages.
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par stoyak Voir le message
    le répertoire qui est utilisé pour faire le pont entre les deux langages.
    Stoyak, est-ce que tu veux parler de l'option log_dir qu'il est possible de paramétrer lors de la création de l'objet bridge entre Perl et R ?

    Dans mon cas, je n'ai pas modifié l'option par défaut. Je suppose donc que le répertoire où le pont est créé est celui qui est mentionné dans la doc du module Statistics::R :

    log_dir
    The directory where the bridge between R and Perl will be created.
    R and Perl need to have read and write access to the directory!
    By dafault it will be created at %TMP_DIR%/Statistics-R.
    Sur mon serveur, j'ai bien un dosssier /tmp/Statistics-R/, si je fais un ls -l sur ce dossier, j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    admin@serveur:~$ ls -l /tmp/Statistics-R/
    drwxrwxrwx 2 www-data www-data 4096 2011-08-02 13:37 output
    adminoca@gxsimaoca:~$
    Comment vérifier que Perl et R ont les droits en écriture sur ce dossier (ça devient plus une question d'ordre Linux... peut-être dois-je poster ailleurs) ?

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    admin@serveur:~$ ls -l /tmp/Statistics-R/
    drwxrwxrwx 2 www-data www-data 4096 2011-08-02 13:37 output
    adminoca@gxsimaoca:~$
    Le répertoire est en 777 donc tout le monde a les droits dessus. Par contre, tu crées l'image dans /home/www-data/test/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $R->send('png("/home/www-data/test/essai.png")');
    et je ne sais pas si l'utilisateur apache a les droits d'écriture dans ce répertoire.

  6. #6
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    Je me suis fait doubler par djibril !
    En effet, ton répertoire temp est accessible à tous en lecture et écriture. Je préfère utiliser l'option log_dir pour paramétrer le répertoire du pont.

    Je suivrai le conseil de djibril et vérifierai si ton utilisateur a les droits sur l'ensemble des répertoires que tu spécifies dans ton script.
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut
    L'utilisateur a bien les droits à 777 sur le dossier /tmp. Du coup, je ne comprends pas le problème.

    En attendant, j'ai trouvé une solution, c'est un peu moins directe mais ça fonctionne.

    L'utilisateur fait toujours des choix dans une interface web, le cgi traite ces choix, envoie une requête à MySQL, récupère les données. Jusque-là rien de nouveau.

    Au lieu d'utiliser le module Statitics::R, le cgi se charge de copier ces données dans un fichier texte, il copie également les quelques commandes qui étaient anciennement envoyées à R via le package. Ce fichier porte l'extension .R.

    Ensuite dans le cgi lance R en tant que processus et il traite le fichier .R.

    Un petit résumé du code est peut-être plus compréhensible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my @pourcentage = (0.89,0.02,0.01);
     
    my $fichierR = "fichierR.R";
     
    open FICR,">:encoding(utf8)","$fichierR" or die "Erreur ouverture du fichier R";
      print FICR '
        pc<-c('. join(",", @pourcentage).');
        png("essai.png");
        plot(pc);
        dev.off();
      ';
    close FICR;
     
    `R CMD BATCH fichierR.R`;
    (Encore une fois) merci aux membres assidus du forum et à leurs réponses rapides !

  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
    Pour le cas précis ça fonctionne, mais si tu avais des variables à échanger entre R et Perl, tu serais limité. Regarde si l'utilisateur apache a les droits sur le home ou le répertoire où tu génères l'image.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par djibril Voir le message
    ... si tu avais des variables à échanger entre R et Perl, tu serais limité.
    D'accord avec toi, c'est vrai que je préférerais utiliser le package que de passer par cette solution.

    Les droits de mon /home sont :
    drwxr-xr-x root root

  10. #10
    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
    Je pense que l'image n'est pas générée car dans ton programme tu lui demandes de créer l'image dans ton home alors que l'utilisateur apache n'a pas les droits. C'est un problème de conception.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut
    Problème de conception ?.. ça ne m'étonne pas.
    Mais il y a surement un problème de compréhension de ma part des droits sous Linux. Quand tu dis qu'Apache n'a pas les droits, qu'elle est la solution à apporter ? Est-ce que je dois juste faire un chmod 777 sur le répertoire /home ? Est-ce que niveau sécurité ça ne pose pas de problème (dans mon cas, les applications tournent uniquement en Intranet donc la sécurité n'est pas une priorité) ? Ou alors, il y a une autre manière de concevoir mon application... dans ce cas je suis preneur de tous conseils...

  12. #12
    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 a plusieurs points.
    Ton site a une architecture, donc l'idéal serait de générer l'image dans un répertoire de travail R accessible en lecture, ecriture (ex /tmp). Ensuite de copier l'image dans le répertoire image de ton site intranet par exemple, et ainsi, tu fais pointer l'url de l'image dans ta page web vers cette image.

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut
    Avec le code suivant, je suis la proposition de djibril. Mon site est dans le répertoire /home/www-data/test et répertoire temporaire pour R est /tmp. Mais le fichier png n'est pas généré. Pourtant, le dossier /tmp est accessible en lecture/écriture par Apache.

    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
    use Statistics::R;
     
    my $R = Statistics::R->new(
    	"tmp_dir" => '/tmp/'
    );
     
    $R->startR;	
     
    $R->send('pc<- c ('. join(",", @pourcentage). ')');
    $R->send('png("essai.png")');
    $R->send('plot(pc)');
    $R->send('dev.off()');
    $R->stopR;
     
    # copie du fichier png du répertoire temporaire vers le répertoire du site
    `cp /tmp/essai.png /home/www-data/test/essai.png`;
     
    # le lien pointe vers ce fichier png
    print '<p><img src="essai.png" alt="essai_graph"/></p>';

  14. #14
    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
    Bien que R ait un répertoire de travail, lorsqu'il génère une image comme dans ton cas, tu dois lui donner le chemin complet de ton image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $R->send('png("/tmp/essai.png")');

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 84
    Points : 66
    Points
    66
    Par défaut
    J'ai bien donné les chemins complets et je crois que ce n'est pas un problème de répertoire de travail.

    Quand je lance des commandes de créations de fichier avec R depuis le cgi en utilisant le module Statistics::R, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(pc, file="essai.txt");
    qui crée un fichier txt reprennant les données de pourcentage (pc) (celles que je veux passer en graphique).
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    postscript("essai.ps");
    plot(pc);
    dev.off();
    qui crée un fichier .ps
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bitmap("essai.bmp");
    plot(pc);
    dev.off();
    qui crée un fichier .bmp

    Ces fichiers sont bien créés dans mon répertoire temporaire. C'est donc la commande R png() qui ne fonctionne pas via un cgi. Pourquoi ?

    Alors, je pourrais me contenter de faire mes graphs avec les fonctions postscript() ou bitmap() puis les convertir en png avec imagemagick... mais ces fichiers .ps ou .bmp sont vides... Du coup, je crois que je vais garder la solution qui fonctionne même si elle n'est pas optimale d'un point de vue conception.

    Merci pour les conseils.

Discussions similaires

  1. cgi et bio perl
    Par chong dans le forum Web
    Réponses: 5
    Dernier message: 05/08/2008, 20h32
  2. Perl CGI et VI perl toolkit
    Par Pierrot2612 dans le forum Langage
    Réponses: 0
    Dernier message: 16/11/2007, 16h00
  3. Réponses: 4
    Dernier message: 16/07/2004, 09h16
  4. [web] afficher le résultat d'un script cgi en perl
    Par Leishmaniose dans le forum Web
    Réponses: 8
    Dernier message: 10/06/2004, 18h36
  5. Réponses: 2
    Dernier message: 19/06/2003, 13h48

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