Page 1 sur 1

[R] Fonction Run : récupérer variable en retour de ligne de

Posté : lun. 13 oct. 2014 17:45
par yannbis
Bonjour,
utilisateur occasionnel d'AutoIt, je souhaité développer une petite application de lecture de QRCode.
je m'appuie pour cela sur l'outil Zbar (http://zbar.sourceforge.net/)
Zbar est utilisable en ligne de commande : en lui fournissant le chemin d'accès d'une image, il retourne la chaine de caractère lue dans le QRCode figurant sur l'image. Cela fonctionne très bien.

En revanche, je n'arrive pas à intégrer cet appel à Zbar dans AutoIt. J'ai déjà utilisé auparavant la fonction Run avec d'autres outils en ligne de commande, mais cette fois je suis bloqué.
Impossible de récupérer la valeur retournée par Zbar comme une variable dans AutoIT.

J'ai essayé de simplifier au maximum la fonction et les erreurs possibles en rassemblant mon script et zbar dans le même dossier.

Je souhaite via AutoIt:
Appeler Zbar avec en paramètre un chemin d'accès "en dur" vers une image contenant un QRCode
Récupérer le résulatt renvoyé par Zbar pour l'afficher dans une fenetre AutoIt

Voici donc le code sur lequel je bute :

Code : Tout sélectionner

$iPID = Run(@ComSpec & "zbarimg -d barcode.jpg", @ScriptDir, @SW_HIDE, 2)
ProcessWaitClose($iPID)
$sQRText = StdoutRead($iPID)
MsgBox(0,"ZBarImg Result", $sQRText)
 

Code : Tout sélectionner

>"D:\Logiciels\LiberKey\MyApps\autoit-v3\SciTe\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "D:\Logiciels\LiberKey\MyApps\autoit-v3\Examples\QR\zbar_simple.au3" /UserParams    
+>17:33:42 Starting AutoIt3Wrapper v.2.1.4.4 SciTE v.3.3.6.0 ;  Keyboard:0000040C  OS:WIN_7/Service Pack 1  CPU:X64 OS:X86    Environment(Language:040C  Keyboard:0000040C  OS:WIN_7/Service Pack 1  CPU:X64 OS:X86)
>Running AU3Check (3.3.10.2)  from:D:\Logiciels\LiberKey\MyApps\autoit-v3
+>17:33:43 AU3Check ended.rc:0
>Running:(3.3.10.2):D:\Logiciels\LiberKey\MyApps\autoit-v3\autoit3.exe "D:\Logiciels\LiberKey\MyApps\autoit-v3\Examples\QR\zbar_simple.au3"    
--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop
+>17:33:45 AutoIt3.exe ended.rc:0
+>17:33:45 AutoIt3Wrapper Finished..
>Exit code: 0    Time: 3.535
Ce code s’exécute avec zbarimg.exe ainsi que l'image barcode.jpg dans le même répertoire (soit par exemple avec l'installation par défaut : C:/Program Files/Zbar/bin).

Le problème est que je je ne récupère pas la variable renvoyée par la ligne de commande. Alors qu'n ligne de commande ça fonctionne très bien.


Merci d'avance pour votre aide.
Y

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : lun. 13 oct. 2014 18:16
par orax
Ce truc va forcément retourné une erreur puisque ça va exécuter quelque chose comme : cmd.exezbarimg -d barcode.jpg. Il manquait un espace après @ComSpec. De plus, @ComSpec n'est pas nécessaire dans ce cas ; il l'est si on veut exécuter des commandes internes de l'interpréteur cmd.exe comme "dir".

Il serait aussi préférable d'utiliser $STDOUT_CHILD au lieu de 2. Ça ne changera rien au fonctionnement du script, c'est juste pour plus de clarté puisque "2" est peut explicite. Il faudra ajouter #include <AutoItConstants.au3> au début du script.

C'est mieux avec ça ?

Code : Tout sélectionner

$iPID = Run("zbarimg -d barcode.jpg", @ScriptDir, @SW_HIDE, $STDOUT_CHILD)

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : lun. 13 oct. 2014 18:18
par pierrotm777
Peut être remplacer @ScriptDir par @ScriptDir\ ???

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : lun. 13 oct. 2014 18:57
par mikell
Gaaaah ! pierrot ! :mrgreen:

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : mar. 14 oct. 2014 10:15
par yannbis
orax a écrit : C'est mieux avec ça ?

Code : Tout sélectionner

$iPID = Run("zbarimg -d barcode.jpg", @ScriptDir, @SW_HIDE, $STDOUT_CHILD)
Merci pour cette réponse. Malheureusement, non ce n'est pas maieux!
En recherchant par rapport à l'erreur renvoyée (/run /prod /ErrorStdOut ) je vois qu'il y a parfois des problèmes entre ls version 32 et 64. En plus, j'utilise AutoIt Portable, c'est peut être une piste...Je vais chercher.

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : mar. 14 oct. 2014 12:07
par walkson

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : mar. 14 oct. 2014 13:54
par yannbis
Merci Walkson, ça fonctionne très bien.
je dois dire que je n'avais pas ouvert les réponses en russe de Google!

Je passe en résolu...même si je ne sais pas pourquoi ça ne fonctionnait pas!
Je posterai le résultat de ma petite appli plus tard.

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : mar. 14 oct. 2014 14:04
par jguinch
Certains programmes redirigent leur sortie vers le flux de sortie "standard" et d'autres vers le flux "d'erreur".
Ici, on a un programme qui redirige vers le flux d'erreur.
Pour le savoir, il suffit de faire le test en ligne de commande : http://www.robvanderwoude.com/battech_redirection.php

Tu peux faire le test avec les commandes suivantes, pour voir ce que ça change :
- dir azertypoiuy
- dir azertypoiuy > nul
- dir azertypoiuy 2> nul
- dir azertypoiuy > nul 2> nul

Re: [R] Fonction Run : récupérer variable en retour de ligne

Posté : mar. 14 oct. 2014 14:44
par walkson
Deux petits conseils (si ça peut être utile):
Ne pas oubliez les espaces avant (et après selon) une variable comme ici:
$Path & ' "' & $QR & '"'
et si le chemin contient un espace comme C:\Mes documents\ de le mettre en "C:\Mes documents\"

Re: [R] Fonction Run : récupérer variable en retour de ligne

Posté : jeu. 30 oct. 2014 12:05
par silmaril92
j ai le même problème ..

j'ai écrit un programme nommé test qui renvoie une chaine de caractère de blabla.

si je l exécute en ligne de commande cela fonctionne très bien:

c:\>test.exe
blabla
c:\>

Ensuite j'ai un second programme test2.au3 (je passe les déclarations...)

$id_test = RunWait ("test.exe", @ScriptDir, @SW_HIDE, $STDOUT_CHILD)
$s_out = StdoutRead ( $id_test )
Msgbox (0,"RESULT", $s_out)


Et mon msgbox affiche un vide.
Comment as tu réglé ton problème ???

Re: [R] Fonction Run : récupérer variable en retour de ligne

Posté : jeu. 30 oct. 2014 13:32
par yannbis
silmaril92 a écrit : Comment as tu réglé ton problème ???
Désolé, pour ma part j'ai trouvé un bout de script qui fonctionne, mais je ne sais pas pouquoi l'autre ne fonctionnait pas...

Re: [R] Fonction Run : récupérer variable en retour de ligne

Posté : jeu. 30 oct. 2014 13:54
par silmaril92
ok c'est indiscret de demander le lien de ton bout de script ou bien le bout de script :)

Re: [R] Fonction Run : récupérer variable en retour de ligne

Posté : jeu. 30 oct. 2014 13:58
par yannbis
silmaril92 a écrit :ok c'est indiscret de demander le lien de ton bout de script ou bien le bout de script :)
juste au dessus...c'est en russe

Re: [..] Fonction Run : récupérer variable en retour de lign

Posté : jeu. 30 oct. 2014 17:58
par orax
Dans le cas de yannbis, ça ne marchait pas puisque le programme écrivait dans le flux des erreurs (STDERR) et le script ne lisait pas ce flux. Voir le message de jguinch, plus haut : http://www.autoitscript.fr/forum/viewto ... 238#p90238
Pour silmaril92, StdoutRead() attend le PID du processus, comme 1er argument. Or, RunWait() renvoie le code d'erreur de fin du processus, au lieu du PID. Il faut donc remplacer RunWait par Run. Voir les exemples de StdoutRead et StderrRead.