Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Einen Prozess starten und input und output stream verbinden auf z.b. Linux (https://www.delphipraxis.net/217575-einen-prozess-starten-und-input-und-output-stream-verbinden-auf-z-b-linux.html)

QuickAndDirty 25. Jul 2025 10:35

Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
In Lazarus gibt es TProcess.
Eine klasse die Prozesse starten kann und deren Input- und Outputstream abfangen kann.
Das geht auf windows und in POSIX systemen.

Kann man sowas mit einer solche Klasse oder auf anderem Wege auch in Delphi machen? Vor allem für Posix oder Linux/Android systeme?

Der schöne Günther 25. Jul 2025 11:10

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
https://github.com/pyscripter/pascal-process ?

QuickAndDirty 25. Jul 2025 13:39

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
Das könnte es sein!

QuickAndDirty 29. Jul 2025 12:38

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
Also ich havbe die unit PascalProcess mal ausprobiert... mehrere tage.
Es scheint gut für manche dinge zu funktionioeren aber andere wiederum nicht so .
Delphi-Quellcode:
procedure ProcessTest;
Begin
  var output:TBytes;
 
  //Funktioniert
  output := TPProcess.Execute('/system/bin/ls -l ttyS9', '/dev' );//output = '--x---x---x ttyS9 hasse nicht gesehen'
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));

  //Funktioniert anscheinend irgendwie nicht alle '*' eingaben kann ls nicht über TPProcess
  output := TPProcess.Execute('/system/bin/ls -l tty*', '/dev' );//output = 'no such file tty*'
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));

  //Ich weiß nicht ob es funktioniert, aber kein output und auch kein effekt, aber auch keine Fehlermeldung
  output := TPProcess.Execute('/system/bin/su root /system/bin/ls -l ttyS9', '/dev' );//output = ''
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));
  output := TPProcess.Execute('/system/bin/su root /system/bin/chmod 777 /dev/ttyS9', '/dev' );//output = ''
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));
end;
Ich glaube dass wenn ich /system/bin/su erzeuge, die Pipes für in/out/err nicht wirklich mit dem Process verbunden sind aber dennoch existieren...deswegen bekomme ich keine Fehlermeldung winn ich in die "in" pipe schreibe und keine error Meldung wenn ich die outpipe auslese...
ich habe das versucht mit nem interaktiven process.

Delphi-Quellcode:
Procedure SetFileRights(const fileRights:String);
Begin
  var report:string;
  try
    var Attributes := TFile.GetAttributes('/dev/ttyS9');
    report := report + 'WriteRights:'+ord(TFileAttribute.faOthersWrite in Attributes).ToString+slineBreak;
    var Process:IPProcess := (TPProcess.Create( '/system/bin/su', '/dev' ) as IPProcess);
    report := report + 'Process Created'+slineBreak;
    Process.MergeError := true;
    Process.Execute;
    report := report + 'Process started'+slineBreak;
    Sleep(150);
    var chmod_Command := 'chmod '+fileRights+' /dev/ttyS9'+linefeed;
    report := report + 'chmod_Command composed: '+chmod_Command+slineBreak;
    var cmd:TBytes := Tencoding.UTF8.GetBytes(UTF8Encode(chmod_command));
    Process.WriteProcessInput(cmd);
    report := report + 'chmod_Command written '+slineBreak;
    Sleep(150);
    report := report + 'Process-Output:' + Tencoding.utf8.Getstring(Process.Output)+slinebreak;
    var exit_Command := 'exit'+linefeed;
    report := report + 'exit_Command composed: '+exit_Command+slineBreak;
    cmd := Tencoding.UTF8.GetBytes(UTF8Encode(exit_Command));
    Process.WriteProcessInput(cmd);
    report := report + 'exit_Command written '+slineBreak;
    Sleep(150);
    Process.Waitfor;
    report := report + 'Process Ended' + slineBreak;
    report := report + 'Process-Output:' + Tencoding.utf8.Getstring(Process.Output)+slinebreak;
    Attributes := TFile.GetAttributes('/dev/ttyS9');
    report := report + 'WriteRights:'+ord(TFileAttribute.faOthersWrite in Attributes).ToString+slineBreak;
  except
    on E:Exception do
    Begin
      report := report +'Exception: '+ e.Message+slinebreak;
    end;
  end;
  sleep(200);
  TDialogService.ShowMessage( Report);
end;
Kein Ergebnis kein output und aber auch keine Fehler

Mache ich irgend etwas falsch?

Der schöne Günther 29. Jul 2025 13:33

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
Ich habe das Ding nie benutzt. Für mich ist das ähnlich wie Kommunikation über serielle Schnittstellen- Alle 6 Monate erfindet jemand eine neue "one size fits all"-Library, aber im Endeffekt verwendet das doch jeder völlig anders. Sowas mache ich lieber maßgeschneidert von Hand.

Auf der anderen Seite ist der gute pyscripter eigentlich einer der besten Pascal-Leute hier auf diesem Planeten. Schreib den doch mal über die englische Delphi-Praxis an, der kann sicher helfen.

QuickAndDirty 29. Jul 2025 13:40

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
Ich versuche jetzt mal das ganze mit "sh"
weil in den beispielen hat er alles mit "cmd" gemacht
vielleicht braucht es "sh" um sicher die in/ou/err pipelines zu verbinden

danach frage ich mal in der Internationalen Delphipraxis.

QuickAndDirty 29. Jul 2025 14:06

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
OMG...
vielleicht kann ich die unit doch benutzen
Delphi-Quellcode:
  var output:TBytes;
  // das geht ja nicht
  output := TPProcess.Execute('/system/bin/su root /system/bin/ls -l ttyS9', '/dev' );//output = ''
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));
  // ABER DAS GEHT
  output := TPProcess.Execute('/system/bin/sh -c "su root /system/bin/ls -l ttyS9"', '/dev' );//output = 'rwx-rwx---x ttyS9 hasse nicht gesehen'
  TDialogService.ShowMessage(Tencoding.UTF8.Getstring(output));

QuickAndDirty 29. Jul 2025 14:15

AW: Einen Prozess starten und input und output stream verbinden auf z.b. Linux
 
Also ok
Alles geht! mann muss einfach immer den prozess /system/bin/sh -c "Meine befehle und prozesse und parameter" starten. Und -s noch dran hängen für interaktive Sitzungen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz