Jemand zu Hause?
Socket und vom Modul
IO::Socket gelesen, auch von pipe() und Pipe per |.
IPC::Cmd ware meine Empfehlung (core-Modul)
IPC::Open3 keine Lösung?
2013-09-12T17:36:01 GwenDragonWelche Probleme hast du denn bei IPC::Cmd genau?
2013-09-12T17:36:01 GwenDragonIPC::Open3 keine Lösung?
2013-09-12T17:46:18 GwenDragonWas klappt da bei dir nicht?
Quote'file not found:...
2013-09-12T17:36:01 GwenDragonIPC::Open3 keine Lösung?
Quotecpan> install IPC::Open3
Warning: Cannot install IPC::Open3, don't know what it is.
Try the command
i /IPC::Open3/
to find objects with matching identifiers.
cpan> i /IPC::Open3/
Module < IPC::Open3::Callback (LTHEISEN/IPC-Open3-Callback-1.01.tar.gz)
Module < IPC::Open3::Callback::Command (LTHEISEN/IPC-Open3-Callback-1.01.tar.gz)
Module < IPC::Open3::Callback::CommandRunner (LTHEISEN/IPC-Open3-Callback-1.01.tar.gz)
Module < IPC::Open3::Callback::NullLogger (LTHEISEN/IPC-Open3-Callback-1.01.tar.gz)
Module < IPC::Open3::Simple (ERWAN/IPC-Open3-Simple-0.04.tar.gz)
Module < IPC::Open3::Utils (DMUEY/IPC-Open3-Utils-0.8.tar.gz)
6 items found
2013-09-12T17:36:01 GwenDragonIPC::Open3 keine Lösung?
IPC::Open3::Utils versucht, installiert auch nicht. Seitenweise voll mit Fehlern.
2013-09-12T17:36:01 GwenDragonIPC::Open3 keine Lösung?
Quote$VAR1 = \*Symbol::GEN1;
$VAR1 = \*Symbol::GEN2;
$VAR1 = \*Symbol::GEN0;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl use strict; use warnings; use diagnostics; use Data::Dumper; use IPC::Open3; my %conf = ( pfad => 'C:/Program Files/******', exe => '*****', ); my ($wtr,$rdr,$err); use Symbol 'gensym'; $err = gensym; my $pid = open3($wtr,$rdr,$err,"$conf{pfad}/$conf{exe}"); print Dumper($wtr); print Dumper($rdr); print Dumper($err);
2013-09-13T09:00:32 GwenDragonIPC::Open3 dient nur dazu ein externes Programm zu starten und dabei auf STDIN, STDERR, STDOUT zugreifen zu können.
2013-09-13T09:00:32 GwenDragonSo wie ich dein Vorhaben und Wissen jetzt interpretiere, ist das dann nicht für dich geeignet.
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/perl use 5.010; use strict; use warnings; use IPC::Cmd qw[can_run run run_forked QUOTE]; my $p=can_run('gpg'); run( command => $p . ' --list-keys test@gwendragon', buffer=>\my $buffer ); say $buffer;
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/perl use 5.010; use strict; use warnings; use IPC::Cmd qw[can_run run run_forked QUOTE]; #my $p=can_run('gpg2'); my $p = QUOTE . 'C:\Program Files (x86)\GNU\GnuPG\pub\gpg2.exe' . QUOTE; run( command => $p . ' --list-keys test@gwendragon', buffer=>\my $buffer ); say $buffer;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#!/usr/bin/perl use strict; use warnings; use diagnostics; use IPC::Cmd 0.84 qw[can_run run run_forked QUOTE]; # Achtung: Cmd.pm Zeile 235 muss auf Win 32Bit so lauten: my $abs = File::Spec->catfile( IS_WIN32 ? Win32::GetShortPathName( $dir ) : Win32::GetANSIPathName($dir), $command); use Data::Dumper; my %conf = ( exe => 'gpg2.exe', ); my $full_path = can_run($conf{exe}); if (defined $full_path) { print "verwende Pfad '$full_path'\n"; my $cmd = $full_path .'' ; my @return = run( command => $cmd, # verbose => 0, buffer =>\my $buffer, timeout => 20, ); # print Dumper(\@return); if ($buffer =~ /gpg: Go ahead and type your message/i) { print WOHIN? "Test"; } # if (defined $buffer) { # print "\n\nErgebnis:\n$buffer"; # } # else { # print "Programmstart gescheitert\n"; # } } else { print "Nicht installiert oder nicht im path\n"; }
IPC::Open3 müsste dafür geeigent sein. Ich sagte ja, ich hab einen schlechten Überblick.
1507751 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
my $pid; eval{ $pid = open3($infh, $outfh, $errfh, $cmd); }; die "open3: $@\n" if $@; print "PID was $pid\n"; my $sel = new IO::Select; # create a select object to notify # us on reads on our FHs $sel->add($outfh,$errfh); # add the FHs we're interested in while(my @ready = $sel->can_read) { # read ready foreach my $fh (@ready) { my $line = <$fh>; # read one line from this fh if(not defined $line){ # EOF on this FH $sel->remove($fh); # remove it from the list next; # and go handle the next FH } if($fh == $outfh) { # if we read from the outfh print OUTPUT $line; # print it to OUTFH } elsif($fh == $errfh) {# do the same for errfh print ERRLOG $line; } else { # we read from something else?!?! die "Shouldn't be here\n"; } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#!/usr/bin/perl use strict; use warnings; use diagnostics; use Data::Dumper; use IPC::Open3; use IO::Select; my %conf = ( pfad => 'C:/Program Files/GNU/GnuPG/pub', exe => 'gpg2zum_test_falsch_geschrieben.exe', ); my ($pid,$infh,$outfh,$errfh); eval { $pid = open3($infh,$outfh,$errfh,"$conf{pfad}/$conf{exe}"); }; if ($@) { print "Fehler '$@' beim Programmstart\n"; } else { print "PID '$pid'\n"; my $sel = new IO::Select; $sel->add($outfh,$errfh); local *OUTPUT; local *ERRLOG; while(my @ready = $sel->can_read) { foreach my $fh (@ready) { my $line = <$fh>; if(not defined $line){ $sel->remove($fh); next; } if($fh == $outfh) { print OUTPUT $line; } elsif($fh == $errfh) { print ERRLOG $line; } else { die "Shouldn't be here\n"; } } } }
QuotePID '3800'
GnuPG::Interface gibt?perldoc GnuPG::Interface...
Description
GnuPG::Interface and its associated modules are designed to provide an object-oriented method for interacting with GnuPG, being able to perform functions such as but not limited to encrypting, signing, decryption, verification, and key-listing parsing.
...
IPC::Cmd weiß niemand, wie man in den Prozess schreiben kann und bei
IPC::Open3 weiß ich nicht, wieso ein Prozess mit einem nicht existenten Programm gestartet werden kann.1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/perl use 5.010; use strict; use warnings; use IPC::Open3; my $cmd = q(P:\Git\bin\ls1.exe); my $pid; $pid = open3( \*CMDIN, \*CMDOUT, \*CMDERR, "$cmd" ); waitpid( $pid, 0 ); ($?>>8) && say "Fehler bei open3 $cmd"; exit;
1 2 3 4 5 6 7 8 9 10 11
#!/usr/bin/perl use 5.010; use strict; use warnings; use IO::Select; my $selector = IO::Select->new(); $selector->add(\*STDIN); my @ready; say @ready = $selector->can_read();
651768 von 2007
IPC::Open3 den Namen CHILD_IN für einen Ausgabedatenstrom verwendet und CHILD_OUT für einen Eingabedatenstrom ;-)
IO::Select überhaupt auf Windows mit irgendetwas anderem als Sockets funktioniert. Allerdings wäre es möglich, äquivalentes Verhalten wie Unix select unter Windows mittels WaitForMultipleObjects zu emulieren. Und wenn
IO::Select hinreichend schlau ist, tut es das vielleicht inzwischen.
2013-09-14T13:13:09 murphyWillst du mich ärgern? Darum geht doch gar nicht ob aus POPELIN oder POPELOUT gelesen werden kann!Ohne jetzt besserwisserisch klingen zu wollen, würde ich nicht erwarten, dass man von STDOUT unbedingt lesen können sollte :-)
2013-09-14T13:13:09 murphyUnd wennIO::Select hinreichend schlau ist, tut es das vielleicht inzwischen.
IO::Select zu gehen für meine Anforderung?
IO::Select viel Mühe gemacht habe, so könnte es sein, dass es auch auf Windows funktioniert, denn rein theoretisch wäre das technisch möglich.
IO::Select brauchst Du aber nur, wenn Du die Kommunikation über mehrere Dateideskriptoren synchron multiplexen willst. Das sollte in Deinem Anwendungsfall nicht zwingend nötig sein.
Win32::Pipe und
Win32::API an2013-09-14T16:18:15 GwenDragonSchau mal perldoc pipe
2013-09-14T16:18:15 GwenDragon
2013-09-14T16:18:15 GwenDragon
2013-09-14T16:18:15 GwenDragon
2013-09-14T16:18:15 GwenDragonMir ist das zu internes Gewühl.
IPC::Cmd auf Win 7 64Bit getestet und hier funktioniert der Programmstart schon mal fehlerfrei.2013-09-18T13:18:20 GwenDragonWie erfahren bist du denn mit Prozesskommunikation auf Systemebene?
IPC::Run auf Win 7 x641 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/perl use 5.010; use strict; use warnings; $|=1; say "Bitte Eingaben: "; while (<>) { chomp; say "Konvertiere '$_' -> '\u$_'"; # Mach riesengroße Buchstaben am Anfang ;) } 1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#!/usr/bin/perl use 5.010; use strict; use warnings; #$ENV{IPCRUNDEBUG}="data"; # debug modus use IPC::Run qw( start pump finish timeout harness ); my (@prog, $in, $out, $err); # Incrementally read from / write to scalars. # $in is drained as it is fed to cat's stdin, # $out accumulates cat's stdout # $err accumulates cat's stderr # $h is for "harness". @prog = ('perl','X:\bin\doit.pl' ); my $h = start \@prog, \$in, \$out, \$err, 10; # Erste Ausgabe des aufgerufenen Programms pump $h until length $out; # Prüfen ob Eingabe erwünscht if ($out =~ /Eingaben:/mg) { # und Eingabe an externes Programm raus $in = "aoeiooeiikmdujkdu\n"; $in .= "abcdefg\n"; $in .= "a\n"; $in .= "ax\n"; $in .= "asseae\n"; } # Hol Ausgabe des externes Programm ab pump $h until length $out; # und Schluss ... finish $h or die "@prog beendet mit Fehlercode $?"; # zeig was das Programm ausgegeben hat say "PROGRAMMAUSGABE:"; say $out;