Schrift
[thread]13003[/thread]

Ausgabe von Programmen auswerten/verwenden

Leser: 2


<< >> 7 Einträge, 1 Seite
sledge77
 2009-01-14 23:35
#117997 #117997
User since
2009-01-14
4 Artikel
BenutzerIn
[default_avatar]
Hallo

ich beschäftige mich seit kurzem mit Perl.
Ich möchte ein Skript schreiben das ein Programm startet (in meinem Fall mencoder). Die Ausgabe des Programms möchte ich in meinem Skript auswerten.

Ich habe mir schon einiges angesehen. Also einfach über open( PS_F, $cmd), über qx und open3. Das Problem das ich mit allen Varianten habe ist das ich nicht alle Ausgaben mitbekomme. Ich vermute das Ausgaben ohne \n nicht, oder erst nach abschließendem \n, an mein Skript zurückgegeben werden. Also z.B. das Hochzählen des Fortschritts in %. Aber genau das möchte ich auswerten/ausgeben.

Gibt es eine Möglichkeit an diese Ausgaben zu kommen?

Vielen Dank

Sledge77
murphy
 2009-01-14 23:57
#117998 #117998
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Manche Programme, die Fortschrittsbalken oder aehnliches Veraenderliches malen wollen, ueberpruefen, ob ihre Ausgabe auf eine Konsole oder eine Pipe geht und in letzterem Falle zeigen sie keine solchen Dinge an.

Auf meiner Kiste tut mencoder das allerdings nicht. Er schreibt seine Fortschrittsanzeige sogar auf STDOUT, so dass hier auch open statt open3 reichen wuerde.

Eventuell ist Dein Problem ja, dass Du die Daten "falsch" einliest. Wenn Du die Fortschrittswerte liest, solltest Du halt -f read statt -f readline benutzen oder local $/ = "\r" setzen, damit Perl nicht bis zum Ende des Datenstromes darauf wartet, ein Zeilenende zu lesen bzw. stattdessen nur bis zum naechsten "Wagenruecklauf" liest.
When C++ is your hammer, every problem looks like your thumb.
sledge77
 2009-01-15 00:08
#117999 #117999
User since
2009-01-14
4 Artikel
BenutzerIn
[default_avatar]
Danke für deine Antwort.

Wenn ich open verwendet habe sah mein Befehl bisher so aus:

Code: (dl )
1
2
3
4
open (PS_F, $prg);
while (<PS_F>) {
print;
}


Wobei $prg meinem mencoder string + " |" entspricht.
Wenn ich es so verwende bekomme ich eben nur das ende mit.
An welcher Stelle müsste ich dann jetzt read verwenden?

Danke

Sledge77
sledge77
 2009-01-15 00:17
#118000 #118000
User since
2009-01-14
4 Artikel
BenutzerIn
[default_avatar]
Danke

Ich habe es hinbekommen.
Für jemanden der zufällig auch nach so etwas sucht:

my $pid = open3(undef, my $reader, undef, $prg);
while (read($reader, my $line, 100)) {
if ($line =~ /([0-9]*%)/)
{
printf("%s\r", $1);
}
}

Funktioniert auch mit open, aber wenn ich nur open benutze kommen noch andere Meldungen (ich denke stderr Meldungen) auf die Konsole. Ich möchte aber alles andere unterdrücken, bzw. selber auswerten.

Nochmals danke für die schnelle hilfe.
Gast Gast
 2009-01-15 07:54
#118005 #118005
Code (perl): (dl )
1
2
3
4
5
6
7
open(my $ph, "$prg 2&>1 |") or die "Konnte Programm nicht starten ($!)\n";
while( ma $line=<$ph>)
{
  if($line=~/(\d*%)/)
  { print "$1\n"; }
}
close($ph) or die "Programm lief nicht ($!)\n";


Das "2&>1" leitet die Error-Meldungen auf die normale Ausgabe um.
"\d" ist das selbe wie "[0-9]"
warum "printf" wenn du eh nichts damit machst?
"\r" solltest du so nicht verwenden, besser ist "\n".
sledge77
 2009-01-15 08:26
#118006 #118006
User since
2009-01-14
4 Artikel
BenutzerIn
[default_avatar]
Danke für die Tipps.

Aber mit dieser while Schleife bekomme ich die "Life" Daten wieder nicht mit.
Das "\r" habe ich verwendet um den Zeilenvorschub zu unterdrücken und das hochzählen des Fortschritts in der selben Zeile fortzuführen.
murphy
 2009-01-15 13:10
#118017 #118017
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Man sollte noch anmerken, dass es generell eine ziemlich schlechte Idee ist, die Zweiargumentform von open zu verwenden, wenn das zweite Argument keine konstante Zeichenkette ist.

Ich wuerde lieber so etwas machen:
Code (perl): (dl )
open my $pipe, '-|', "$program 2>&1" or die "Error opening pipe: $!\n"
, dann passieren keine komischen Sachen, wenn jemand mutwillig Dinge in $program schreibt, die kein einfacher Pfad sind, sondern zum Beispiel mit < beginnen...
When C++ is your hammer, every problem looks like your thumb.
<< >> 7 Einträge, 1 Seite



View all threads created 2009-01-14 23:35.