Problème avec exec() PHP (pour Scilab) [Résolu/Fermé]

Signaler
-
 todisoamichel -
Bonjour,


Pour mon site, j'utilise la fonction PHP exec() pour exécuter mes scripts Scilab.
Mon problème, c'est que sur 2 de mes scripts qui fonctionnent parfaitement sur la console Scilab, un fonctionne avec PHP et pas l'autre !

En détail avec 2 petits scripts :

Cela fonctionne :
Script Scilab (test.sce) :
clear;
m=[1 2 3; 3 4 5];
disp(m);

Code PHP :
$path = '..\scilab-5.3.3\bin\\';  
$path_script = 'test.sce';  
$command = $path.'scilex -nwni -nb -f '.$path_script;  
exec($command, $output);  
echo '<pre>';  
print_r ($output);  
echo '</pre>';  



Mais cela ne fonctionne pas :
Script Scilab (test2.sce) :
clear;
if (1 < 2)
disp("si tu vois ça, ça marche !");
else
disp ("si tu vois ça, ça marche, mais plus les mathématiques !");

Code PHP :
$path = '..\scilab-5.3.3\bin\\';  
$path_script = 'test2.sce';  
$command = $path.'scilex -nwni -nb -f '.$path_script;  
exec($command, $output);  
echo '<pre>';  
print_r ($output);  
echo '</pre>';  



Alors j'ai travaillé un peu la question, et déjà les structures conditionnelles if/else ainsi que les chaînes de caractères font buguer la commande... Comment passer outre ce problème et exécuter avec PHP n'importe quel script qui fonctionne sous Scilab ??? Quelqu'un a une idée ?


Cordialement,
Nono

2 réponses

Messages postés
689
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
25 mars 2015
95
Messages postés
689
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
25 mars 2015
95
c'est vrai que c'est étrange, je ne suis pas un pro en scilab mais faut pas fermer la condition par un end; ?
Messages postés
63
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
1 octobre 2016
3
Alors j'avoue que moi non plus, je ne suis qu'un novice en Scilab, mais oui, il faut mettre un "end;" normalement pour finir une structure conditionnelle (mais qu'il y soit ou pas, cela fonctionne sous la console Scilab mais pas sous PHP...).

Plus déroutant encore : j'ai testé le code de l'exemple que tu as donné, et même avec cette méthode, cela ne fonctionne pas avec des caractères. J'ai juste voulu tester ceci :
clear;
disp("Hello World");

Et même problème : Scilab est lancé dans les processus en fond sur mon ordi mais tourne en boucle sans réussir à exécuter le script (pourtant pas compliqué ! ^^)... Pourtant, le code de l'exemple prend bien en compte le remplacement de certains caractères spécifiques (tels que le ")... Je suis en train de me dire que ce que je veux faire n'est pas possible !
Messages postés
689
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
25 mars 2015
95
en effet, peut-être faut-il passer par du PERL pour "killer" le processus à la fin de son exécution pour lancer un nouveau processus scilab.
Messages postés
689
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
25 mars 2015
95
http://fossies.org/unix/misc/scilab-5.3.3-src.tar.gz:a/scilab-5.3.3/modules/windows_tools/src/c/scilab_windows/killScilabProcess.h

il existe un outil apparemment pour tuer le processus.
Messages postés
63
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
1 octobre 2016
3
Je ne suis pas sûr, mais je peux lancer plusieurs scripts à la suite qui fonctionne et même si je kill les processus Scilab complètement et que je relance un script qui ne fonctionne pas, ça ne fonctionne toujours pas... Donc je ne pense pas que ça vienne de là.

Il est possible que le problème vienne vraiment des caractères (comme ', ", \, if, else, etc) qui pourraient être analysés par PHP à un moment que je ne comprends pas... Et causer une erreur d'exécution.

Encore merci pour ton aide en tout cas.
Messages postés
63
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
1 octobre 2016
3
Alors j'ai re-vérifié sous DOS l'exécution de mes scripts (.sce) et cette fois, même ceux avec des chaînes de caractères ou des conditions if/else fonctionnent... Donc cela vient bien du PHP et de la façon dont sont lu ces caractères/mots clés. Au-moins, j'ai une légère idée de où chercher...

Pour info, voici mes commande DOS :
MyRepertory>Scilex -nwni -nb -f test2.sce
Messages postés
63
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
1 octobre 2016
3
Alors, il se trouve que ça fonctionne finalement ! Lorsque j'intègre le "exit;" directement dans le script (.sce)... J'ai l'impression qu'on ne peut pas fait faire :
exec('Scilex -nwni -nb -f script.sce exit;', $output);

Et c'est pour ça que Scilab tournait sans fin !

Que ce soit avec "exit;" ou l'ajout de n'importe quel autre morceau de code Scilab. Sinon, il faut mettre seulement du code Scilab à la place et l'option -e en remplacement de -f.

Donc pour rendre justice : l'erreur venait du fait que le développeur (en l'occurrence moi), n'avait juste pas mis de "exit;" dans les qq scripts de tester avec des chaînes de caractères ou des conditions ! Pas bien !


Alors une dernière question : Et si on veut vraiment pouvoir faire qqch du style :
exec('Scilex -nwni -nb -f script1.sce clear; script2.sce exit;', $output);

Une des solutions serait de pouvoir extraire sous forme de chaîne de caractères le code contenu dans les fichiers .sce et de le placer dans une variable PHP ou alors une option -magic pour faire ça ! ^^
Je vais chercher ça de mon côté.
Messages postés
63
Date d'inscription
mardi 3 janvier 2012
Statut
Membre
Dernière intervention
1 octobre 2016
3
C'est super, j'ai trouvé comment partir à l'aventure :
$monfichier = fopen('test.sce', 'r');
echo('Voici ce que contient mon code : <br>');
while($ligne = fgets($monfichier)){
print_r($ligne);
echo "<br />";
}
fclose($monfichier);


Avec cette méthode et l'option -e, je pense qu'on peut faire pas mal de chose avec PHP et Scilab combiné. Si ça peux donner des idées à certains, j'aurais pas posté ça inutilement ! ^^

bonjour!
merci pour le tuyau. j'ai toutefois une question: est-ce que vous savez pourquoi scilab-5.4.0 na veut plus redémarrez et m'affiche: "scilab ne peut pas créer la classe principale java scilab( la classe Scilab est impossible a trouver.vérifiez si les paquets scilab et thirdparty sont accessibles)? et comment redémarrer scilab?

merci beaucoup