Externen Prozess aufrufen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1776
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Externen Prozess aufrufen

Beitrag von fliegermichl »

Ich habe in meinem Programmchen einen Menüpunkt "In GIT speichern". Der Eventhandler sieht so aus:

Code: Alles auswählen

procedure TMainform.mnuSaveToGitClick(Sender: TObject);
var aProcess : TProcess;
    Msg : string;
    Lst : TStringlist;
    InputStrings : string;
begin
  Msg := s_msg_save_changes;
  if InputQuery(s_msg_savegitCaption, s_msg_savegitPrompt, msg) then
  begin
    aProcess := TProcess.Create(nil);
    Lst := TStringList.Create;
    aProcess.Executable:='git.exe';
    aProcess.Parameters.Add('commit');
    aProcess.Parameters.Add('-a');
    aProcess.Parameters.Add('-s');
    aProcess.Parameters.Add('-m"' + Msg + '"');
    aProcess.CurrentDirectory:=Application.Location;
    AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
    aProcess.Execute;
    Lst.LoadFromStream(AProcess.Output);
    aProcess.Free;
    ShowMessage(Lst.Text);
    aProcess := TProcess.Create(nil);
    InputStrings := 'meinganzsicherespasswort' + LineEnding;
    aProcess.Executable:='git.exe';
    aProcess.Parameters.Add('push');
    aProcess.CurrentDirectory:=Application.Location;
    aProcess.Options := AProcess.Options + [poUsePipes];
    aProcess.Execute;
    aProcess.Input.Write(InputStrings[1], Length(InputStrings));
    Lst.LoadFromStream(AProcess.Output);
    Msg := 'Meldung: ' + Lst.Text;
    Lst.Clear;
    Lst.LoadFromStream(AProcess.StdErr);
    if Lst.Text <> '' then
      Msg := Msg + LineEnding + 'Fehler: ' + Lst.Text;
    aProcess.Free;
    ShowMessage(Msg);
    Lst.Free;
  end;
end;
Der Aufruf für das commit funktioniert auch. Beim Push bekomme ich die Fehlermeldung.
Mach ich git push in der Shell, klappt es ohne Probleme.
Was kann denn da der Unterschied sein?

gitfehler.png
gitfehler.png (9.86 KiB) 408 mal betrachtet

Ich habe es bei Inputstring mit und ohne LineEnding versucht. Es klappt aber nicht.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7302
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Externen Prozess aufrufen

Beitrag von af0815 »

Es könnte sein, das der Zeitpunkt für das Passwort noch nicht optimal ist. Deswegen kommt die Fehlermeldung mit den Rechten. Generell ist es so, das TProcess keine Shell ist und man daher immer wieder Unterschiede hat.

IMHO hat Corpsmann in seinen vielen Beispiel auch etwas über GIT, da dürfte das funktionieren. Vielleicht dort man nachsehen.

Ich versuche da auf LibGit zu gehen, das ist direkter, aber ich bin da noch beim Durchsteigen, wir noch eine ganz schöne Lernkurve.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1776
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Externen Prozess aufrufen

Beitrag von fliegermichl »

Ja, das hatte ich auch vermutet aber wenn man versucht in den Inputstream zu schreiben, bevor Execute aufgerufen wurde, gibt es ein SIGSEGV.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1776
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Externen Prozess aufrufen

Beitrag von fliegermichl »

Git liest das Passwort nicht aus dem Standard Input. Wenn ich in der Shell

Code: Alles auswählen

echo MeinsicheresPasswort|git push
eingebe, dann erscheint trotzdem die Eingabeaufforderung für das Passwort und ich muss es über die Tastatur eingeben.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1782
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Externen Prozess aufrufen

Beitrag von corpsman »

af0815 hat geschrieben: Do 14. Mai 2026, 09:01 Es könnte sein, das der Zeitpunkt für das Passwort noch nicht optimal ist. Deswegen kommt die Fehlermeldung mit den Rechten. Generell ist es so, das TProcess keine Shell ist und man daher immer wieder Unterschiede hat.

IMHO hat Corpsmann in seinen vielen Beispiel auch etwas über GIT, da dürfte das funktionieren. Vielleicht dort man nachsehen.

Ich versuche da auf LibGit zu gehen, das ist direkter, aber ich bin da noch beim Durchsteigen, wir noch eine ganz schöne Lernkurve.
Ich habe alle meine Systeme so konfiguriert, dass ich keine Passwörter eingeben muss, und umschiffe damit das Problem ;)
--
Just try it

Soner
Beiträge: 802
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Externen Prozess aufrufen

Beitrag von Soner »

Du kannst die Ausgabe von TProcess in einer Schleife nach Benutzername/Password untersuchen und per Programm senden.
Siehe Wiki.

Ich hatte von Jahren ein Beispielprogramm zusammengebastelt mit dem Code von hier und da, erinnere mich nicht mehr. Es ist auch gut "dokumentiert", schau es dir an, vielleicht hilft es dir.

Edit:
Andere Lösung ist vielleicht vor:

Code: Alles auswählen

 aProcess.Input.Write(InputStrings[1], Length(InputStrings));
Sleep hinzufügen, damit git gestartet hat und auf Passworteingabe wartet.
Dateianhänge
cmdrun1pub.zip
(65.47 KiB) 12-mal heruntergeladen

Antworten