Seite 1 von 1

RunProgram(), ReadProgramString()... mehrzeilige Ausgaben

Verfasst: 11.10.2014 20:46
von mave
PureBasic 5.30-32bit - Branch: v5.30 Revision: 1654 unter OpenSuse 13.1]

Hallo,

für ein Programm, das einen html2pdf-Konverter aufruft ("wkhtmltopdf"), der mehrzeilig auf stdout Infos ausgibt, möchte ich diese Ausgaben per ReadProgramString() auslesen. Das gelingt partout nicht. Die Suche in den Foren brachte u.a. einen Beispielcode, der das Kommando "ls" verwendet und damit Dateinamen ausgibt.
Das funktioniert, wenn "ls" kein Parameter bekommt. Schon das Kommando "ls" mit Parameter "*", der in der Konsole eine andere Art der Auflistung auswirft, liefert keine Ausgabe mehr. Auch Varianten mit ReadProgramData() brachten nichts.

wkhtmltopdf z.B. gibt in einer Konsole in etwas sowas aus:
Loading page (1/2)
[=================> ] 35%

um dann abzuschließen mit:

Printing pages (2/2)
Done
Durch Auslesen der Prozentzahl wäre in einer GUI die Fortschrittsanzeige zu füttern, beim Auslesen von "Done" = fertig.
Geht aber nicht, weil ich bisher nicht an die Ausgaben herankomme.

Hmmm...????

Code: Alles auswählen

;con = OpenConsole() ; ===> Deaktiviert, weil unter 5.30 OpenConsole in der IDE eh grad nicht funktioniert...
;EnableGraphicalConsole(1) 

#Coding = #PB_Ascii

; ============>>>>>>>>>>>>>>>>>>>>>>> Parameter "*" und nix geht...
ls = RunProgram("ls","*","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Error) ;|#PB_Program_Write)
;ls = RunProgram("ls","","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Error) ;|#PB_Program_Write)

If IsProgram(ls)
  While ProgramRunning(ls)
    stderr.s = ReadProgramError(ls, #Coding)
    If stderr.s <> ""
      ;PrintN("stderr: "+stderr)
      Debug stderr
    EndIf
    If AvailableProgramOutput(ls)
      stdout.s = ReadProgramString(ls, #Coding)
      ; PrintN("stdout: "+stdout)
      Debug stdout
    EndIf
  Wend

  stderr.s = ReadProgramError(ls, #Coding)
  If stderr.s <> ""
    ;PrintN("stderr: "+stderr)
    Debug stderr
  EndIf

  CloseProgram(ls)
EndIf
;CloseConsole()
End

Re: RunProgram(), ReadProgramString()... mehrzeilige Ausgabe

Verfasst: 12.10.2014 01:44
von NicTheQuick
Bei mir kommt bei "*" das hier als Ausgabe:
ls: Zugriff auf * nicht möglich: Datei oder Verzeichnis nicht gefunden
Das ist auch logisch. Das Sternchen wird normalerweise von der bash übersetzt in viele einzelne Parameter. Wenn du mit 'ls' ein Verzeichnis auflisten willst, musst du einfach einen Punkt verwenden:

Code: Alles auswählen

ls = RunProgram("ls",".","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Error) ;|#PB_Program_Write)

Re: RunProgram(), ReadProgramString()... mehrzeilige Ausgabe

Verfasst: 13.10.2014 12:26
von mave
Ha! Da hätte ich mal draufkommen können :oops: Danke für den Hinweis.

Und: Zusätzlich habe ich herausgefunden, dass wkhtmltopdf (zumindest in der aktuellen Version) über stderr seine Konsolenausgaben macht. Das ist natürlich nicht im Sinne des Erfinders und wurde den Entwicklern an anderer Stelle schon gemeldet. Aber immerhin kommt 'was an, auch wenn die Auswertung der mit ReadProgram...() erhaltenen Strings nicht ganz einfach ist, weil in einer Rückgabe auch schon mal mehrere Ausgabezeilen landen, d.h. mancher Vorgang dann schon wieder obsolet ist. Aber das ist nebensächlich.