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

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
mave
Beiträge: 7
Registriert: 22.05.2014 22:31

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

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

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

Beitrag 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)
Bild
mave
Beiträge: 7
Registriert: 22.05.2014 22:31

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

Beitrag 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.
Antworten