Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

script Python exécuté dans un script Perl, saisie au clavier ?

9 réponses
Avatar
ctobini
Bonjour,

Je dois utiliser un script Python qui demande =E0 l'utilisateur de
saisir certaines valeurs.

Je souhaite appeler ce script dans un de mes scripts Perl, or, en
utilisant 'system' ou 'exec', il me semble impossible de faire ceci (la
doc pr=E9cise que Perl laisse =E0 ce moment l=E0 enti=E8rement la main au
programme appel=E9).

Je souhaite savoir s'il y a moyen d'avoir la partie renvoy=E9e au
Terminal par Python dans ces conditions, et de saisir ainsi les valeurs
demand=E9es.

En vous remerciant.

C=2E Tobini

9 réponses

Avatar
Paul Gaborit
À (at) 20 Sep 2005 08:07:45 -0700,
"ctobini" écrivait (wrote):
Je dois utiliser un script Python qui demande à l'utilisateur de
saisir certaines valeurs.

Je souhaite appeler ce script dans un de mes scripts Perl, or, en
utilisant 'system' ou 'exec', il me semble impossible de faire ceci (la
doc précise que Perl laisse à ce moment là entièrement la main au
programme appelé).

Je souhaite savoir s'il y a moyen d'avoir la partie renvoyée au
Terminal par Python dans ces conditions, et de saisir ainsi les valeurs
demandées.


Si vous voulez communiquer dans les deux sens avec votre script
(envoyer des commandes et recevoir les résultats), vous pouvez
regarder du côté du module Expect.

Sinon, une autre voie plus efficace serait le module Inline::Python.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
pointer2002
Essaye IPC::Open2 ou Open3 (au lieu de exec ou system) qui permet de
piloter un sous process en recupérant les flux d'entrée et de sortie
auquel cas il faut que les données à récupérer du script python
soient écrites sur STDOUT.
Sinon il est sans doute possible de rediriger les sorties de ton script
python vers un fichier et de lire ce fichier avec perl ...
Avatar
ctobini
Bonjour et merci de la réponse, je me suis intéressé au module
Expect,

J'ai bien compris la manière générale dont fonctionne Expect, mais
mon problème c'est la manière de l'utiliser :

Côté Python, si j'ai un script simple :

print 'Saisir nombre 1'
nb1 = input()
print 'Saisir nombre 2'
nb2 = input()

Côté perl, j'utilise
my $exp = Expect->spawn(./script.py);
my $line = $exp->expect me renvoie chaque ligne

Si j'ai bien compris, c'est au moment où Python demande nb1 = input()
qu'il faudrait effectuer le $line->send() et là je ne sais pas comment
le lui indiquer.

Merci si vous aviez des infos là-dessus.

C. Tobini
Avatar
ctobini
Bonjour et merci de la réponse,

Côté Python, il y'a une demande du style :

print 'Entrez l'adresse IP :'
ip = input();
print 'Entrez utilisateur :'
util = input();

Il faudrait donc que je puisse renseigner ip et util.

C. Tobini
Avatar
Paul Gaborit
À (at) 21 Sep 2005 06:25:28 -0700,
"ctobini" écrivait (wrote):
Côté Python, si j'ai un script simple :

print 'Saisir nombre 1'
nb1 = input()
print 'Saisir nombre 2'
nb2 = input()

Côté perl, j'utilise
my $exp = Expect->spawn(./script.py);
my $line = $exp->expect me renvoie chaque ligne

Si j'ai bien compris, c'est au moment où Python demande nb1 = input()
qu'il faudrait effectuer le $line->send() et là je ne sais pas comment
le lui indiquer.


Je n'utilise jamais Expect (je n'en ai jamais eu besoin). Mais, au vu
de votre description, j'attendrai de recevoir 'Saisir nombre 1' en
utilisant la méthode 'expect' *avec* ses paramètre (timeout et
pattern) avant d'utiliser 'send' pour écrire la valeur... et ainsi de
suite.

La question suivante est "quoi faire lorsque 'expect' se termine sur
un timeout ?"...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Dav'
Bonjour,
Pour faire quick and dirty il y a surement (sous unix) un moyen avec un
echo et la commande system.

Voici ce que j'ai testé :

programme t.pl ( equivalent de votre programe python) :

#!/usr/bin/perl
use strict ;
print "ENTER 1n" ;
$a = <STDIN> ;
print "ENTER 2n" ;
$b = <STDIN> ;

print $a + $b, "n" ;


programme j.pl ( script perl appellant ) :

#!/usr/bin/perl
print "Parametre 1 ?n";
$p1 = <STDIN> ;
chomp $p1 ;
print "Parametre 2 ?n";
$p2 = <STDIN> ;
chomp $p2 ;

$toto = `echo "$p1n$p2"|perl t.pl`;
print $toto ;


Et j.pl fait la somme !

Dav'
Avatar
ctobini
Oui, 'Saisir nombre 1' est bien repéré avec un regex, mais la ligne
d'input finit sur un timeout (une erreur donc), c'est là que je ne
sais pas comment traiter...
Avatar
Paul Gaborit
À (at) 21 Sep 2005 08:26:13 -0700,
"ctobini" écrivait (wrote):
Oui, 'Saisir nombre 1' est bien repéré avec un regex, mais la ligne
d'input finit sur un timeout (une erreur donc), c'est là que je ne
sais pas comment traiter...


Peut-on voir le code ?


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ctobini

À (at) 21 Sep 2005 08:26:13 -0700,
"ctobini" écrivait (wrote):
Oui, 'Saisir nombre 1' est bien repéré avec un regex, mais la ligne
d'input finit sur un timeout (une erreur donc), c'est là que je ne
sais pas comment traiter...


Peut-on voir le code ?


Bonjour et désolé de vous répondre un peu tardivement,

C'est gentil de me proposer d'inverstir de votre temps dans la lecture
du code mais il faudrait avant que je fixe 2 choses : il faudrait que
je le dépiote intégralement le script afin de ne pas envoyer tout et
n'importe quoi (le script fait un millier de lignes) et comme c'est
dans un cadre professionnel, je ne suis pas du tout certain de pouvoir
le faire :-/

Maintenant, la partie me concernant est réellement du style
1. ligne d'avertissement de saisie
2. input

Et envoie d'une ligne sur l'input.

C. Tobini