Discussion:
Lancement de processus par open
(trop ancien pour répondre)
Eric C.
2011-04-21 10:04:41 UTC
Permalink
Bonjour à tous,

Je cherche à lancer des processus via "open+pipe", sur un poste
Windows.
Le seul point délicat à gérer concerne la présence d'espaces dans le
chemin d'accès à mon exécutable, et la consultation du fil http://bit.ly/fKvxLM
m'a permis de trouver des solutions pour gérer les arguments multiples
(la solution proposée par Paul Gaborit - syntaxe étendue d'open, avec
passage d'arguments en liste - n'est apparemment pas implémentée dans
mon perl 5.10)

Ci-dessous mes quelques tests, qui fonctionnent tous comme prévu sauf
le dernier :quelqu'un peut-il m'expliquer pourquoi l'appel n°5 redonne
le msg "'C:\Program' n'est pas reconnu en tant que commande interne
bla bla ..." que les solutions 3 et 4 permettent de contourner ?

use strict;
use File::Spec::Functions;
use Cwd;

my $cmd= 'C:\Program Files\Internet Explorer\iexplore.exe';
my $file = catfile(cwd(),'z.html');

# open SORTIE,$cmd." |"; # 1 : OK
# open SORTIE,$cmd." ".$file." |"; # 2 : NOK
# open SORTIE,"\"$cmd\" ".$file." |"; # 3 : OK
# open SORTIE,"\"$cmd\" $file |"; # 4 :OK
my $ligne = $cmd." ".$file;
open SORTIE,"\"$ligne\" |"; # 5 : NOK ?
while (<SORTIE>) {
#...
}
close SORTIE;


Merci,

Eric
Paul Gaborit
2011-04-21 11:59:54 UTC
Permalink
À (at) Thu, 21 Apr 2011 03:04:41 -0700 (PDT),
Post by Eric C.
Le seul point délicat à gérer concerne la présence d'espaces dans le
chemin d'accès à mon exécutable, et la consultation du fil http://bit.ly/fKvxLM
m'a permis de trouver des solutions pour gérer les arguments multiples
(la solution proposée par Paul Gaborit - syntaxe étendue d'open, avec
passage d'arguments en liste - n'est apparemment pas implémentée dans
mon perl 5.10)
Ci-dessous mes quelques tests, qui fonctionnent tous comme prévu sauf
le dernier :quelqu'un peut-il m'expliquer pourquoi l'appel n°5 redonne
le msg "'C:\Program' n'est pas reconnu en tant que commande interne
bla bla ..." que les solutions 3 et 4 permettent de contourner ?
En tout premier lieu, N'UTILISEZ PAS DE BACKSLASH pour les chemins
Windows. Refaites *tous* vos tests en utilisant des chemins du type :

my $path = "C:/Progam Files/...";

Cela fait très longtemps que Windows accepte autant le "\" que le "/"
comme séparateur.

Si certains problèmes persistent, revenez alors nous en parler. ;-)
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Eric C.
2011-04-21 12:40:55 UTC
Permalink
Je sais ... :)
... mais dans la vraie vie je récupère le nom de mon exe dans un
fichier ascii exporté depuis une appli tierce, où il est tout à fait
possible que l'utilisateur ait renseigné un chemin avec backslashs.
Certes, je pourrais effectuer la conversion en amont ...
... mais le même test effectué avec des slashs donne le même
résultat :

use strict;
use File::Spec::Functions;
use Cwd;
my $cmd= 'C:/Program Files/Internet Explorer/iexplore.exe';
my $file = catfile(cwd(),'z.html');
my $ligne = $cmd." ".$file;
open SORTIE,"\"$ligne\" |"; # 5 : NOK ?
while (<SORTIE>) {
#...
}
close SORTIE;

ne fonctionne pas davantage.


Eric
Paul Gaborit
2011-04-21 15:31:21 UTC
Permalink
À (at) Thu, 21 Apr 2011 05:40:55 -0700 (PDT),
Post by Eric C.
... mais le même test effectué avec des slashs donne le même
use strict;
use File::Spec::Functions;
use Cwd;
my $cmd= 'C:/Program Files/Internet Explorer/iexplore.exe';
my $file = catfile(cwd(),'z.html');
my $ligne = $cmd." ".$file;
open SORTIE,"\"$ligne\" |"; # 5 : NOK ?
while (<SORTIE>) {
#...
}
close SORTIE;
ne fonctionne pas davantage.
Normal : vos " supplémentaires autour de $ligne casse tout. Elles ne
devraient apparaître qu'autour de $cmd. Et vous devriez en mettre aussi
autour de $file. Avec un truc comme ça :

my $ligne = qq{"$cmd" "$file"};
open SORTIE,"$ligne |"
or die "Can't exec '$ligne': $!\n";

est-ce que ça marche mieux ?

Ceci étant, je ne suis pas sûr que iexplore.exe propduira beaucoup de
chose sur SORTIE...
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Eric C.
2011-04-22 06:48:43 UTC
Permalink
Post by Paul Gaborit
À (at) Thu, 21 Apr 2011 05:40:55 -0700 (PDT),
Post by Eric C.
... mais le même test effectué avec des slashs donne le même
use strict;
use File::Spec::Functions;
use Cwd;
my $cmd= 'C:/Program Files/Internet Explorer/iexplore.exe';
my $file = catfile(cwd(),'z.html');
my $ligne = $cmd." ".$file;
open SORTIE,"\"$ligne\" |";                    # 5 : NOK ?
while (<SORTIE>) {
   #...
}
close SORTIE;
ne fonctionne pas davantage.
Normal : vos " supplémentaires autour de $ligne casse tout. Elles ne
devraient apparaître qu'autour de $cmd. Et vous devriez en mettre aussi
  my $ligne = qq{"$cmd" "$file"};
  open SORTIE,"$ligne |"
   or die "Can't exec '$ligne': $!\n";
est-ce que ça marche mieux ?
Ca fonctionne, en effet, merci
Post by Paul Gaborit
Ceci étant, je ne suis pas sûr que iexplore.exe propduira beaucoup de
chose sur SORTIE...
C'était à titre d'exemple :)
Le test peut ainsi être effectué par quiconque disposant d'un PC,
alors que la livraison de l'exe avec lequel je travaille effectivement
aurait été un peu plus contraignante :)

Eric

Erwan David
2011-04-21 13:09:35 UTC
Permalink
Post by Paul Gaborit
À (at) Thu, 21 Apr 2011 03:04:41 -0700 (PDT),
Post by Eric C.
Le seul point délicat à gérer concerne la présence d'espaces dans le
chemin d'accès à mon exécutable, et la consultation du fil http://bit.ly/fKvxLM
m'a permis de trouver des solutions pour gérer les arguments multiples
(la solution proposée par Paul Gaborit - syntaxe étendue d'open, avec
passage d'arguments en liste - n'est apparemment pas implémentée dans
mon perl 5.10)
Ci-dessous mes quelques tests, qui fonctionnent tous comme prévu sauf
le dernier :quelqu'un peut-il m'expliquer pourquoi l'appel n°5 redonne
le msg "'C:\Program' n'est pas reconnu en tant que commande interne
bla bla ..." que les solutions 3 et 4 permettent de contourner ?
En tout premier lieu, N'UTILISEZ PAS DE BACKSLASH pour les chemins
my $path = "C:/Progam Files/...";
Cela fait très longtemps que Windows accepte autant le "\" que le "/"
comme séparateur.
Windows, pas trop même en XP certaines parties le refusent. Par contre
l'OS qui est en dessous de l'interface le fait depuis MS-DOS 3.1 (la
dernière version avant la convergence avec Unix, disait un certain
B. G. à l'époque).

Cela dit, je plussoie...
--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Paul Gaborit
2011-04-21 15:33:12 UTC
Permalink
À (at) Thu, 21 Apr 2011 15:09:35 +0200,
Post by Erwan David
Post by Paul Gaborit
Cela fait très longtemps que Windows accepte autant le "\" que le "/"
comme séparateur.
Windows, pas trop même en XP certaines parties le refusent. Par contre
l'OS qui est en dessous de l'interface le fait depuis MS-DOS 3.1 (la
dernière version avant la convergence avec Unix, disait un certain
B. G. à l'époque).
J'ai toujours cru que Windows était un système d'exploitation avec une
interface graphique par dessus (explorer ?). On m'aurait menti ?
;-)
Post by Erwan David
Cela dit, je plussoie...
On est d'accord.
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Continuer la lecture sur narkive:
Loading...