Fragen zu TProcess

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 5039
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

sstvmaster hat geschrieben:
Fr 10. Jul 2020, 00:01
Mathias hat geschrieben:
Do 9. Jul 2020, 22:58
Hier kommt eine Warnung, dies sei deprecated.
Welche Funktion sollte man da alternativ nehmen ?

Code: Alles auswählen

  AProcess.Executable := 'avrdude';
  AProcess.Parameters.Add('-cusbasp');
  AProcess.Parameters.Add('-pattiny2313');
Steht alles hier: https://www.freepascal.org/docs-html/cu ... ocess.html
Da müsste mal das Wiki angepasst werden, dort steht über all noch "AProcess.CommandLine".
Windows ist da soweit ich weiß ein wenig eigensinniger: Alle Parameter müssen zusammen als eine Befehlszeile übergeben werden
Somit nicht ganz Plattformübergreifen ?
Wen man es so trennen müsste.
Linux:

Code: Alles auswählen

  AProcess.Parameters.Add('-cusbasp');
  AProcess.Parameters.Add('-pattiny2313');
Windoof:

Code: Alles auswählen

  AProcess.Parameters.Add('-cusbasp -pattiny2313');
:roll:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

marcov
Beiträge: 1073
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Fragen zu TProcess

Beitrag von marcov »

Und in 99% der Fälle kann man Einfachweg etwas wie

Code: Alles auswählen

var outputstring : string;
Runcommand('avrdude',['-cusbasp','-pattiny2313'],outputstring); nutzen.
Seit 3.2.0 gibt es auch viel mehr Optionen für Runcommand.
Zuletzt geändert von marcov am Fr 10. Jul 2020, 14:13, insgesamt 1-mal geändert.

Mathias
Beiträge: 5039
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

marcov hat geschrieben:
Fr 10. Jul 2020, 10:02
Und in 99% der Fälle kann man Einfachweg etwas wie

Runcommand('avrdude',['-cusbasp','-pattiny2313']); nutzen.

Seit 3.2.0 gibt es auch viel mehr Optionen für Runcommand.
In meinem Fall will ich die Ausgabe auswerten,
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

marcov
Beiträge: 1073
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Fragen zu TProcess

Beitrag von marcov »

Mathias hat geschrieben:
Fr 10. Jul 2020, 12:43
In meinem Fall will ich die Ausgabe auswerten,
Das einfach mache ist der Grund Runcommand existiert. Nur wenn man etwas interaktiv machen will.(nicht nur die Output am Enden bekommen), muss man nach "vollem" TProcess gehen.

Ich habe die Code in meinen Post noch etwas verdeutlicht.

Warf
Beiträge: 1480
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Fragen zu TProcess

Beitrag von Warf »

Winni hat geschrieben:
Fr 10. Jul 2020, 00:26
FF - Fiese Falle bei Process.Parameters.add:

Kein Leerzeichen innerhalb von add, sondern zu zweimal Parameters.add trennen.
Zumindest in Linux verweigert er sonst den Job!
Das ist keine Fiese Falle, das ist genau so wie es sein soll, ein Eintrag soll ein Parameter sein. Wenn du zwei parameter übergeben willst musst du zwei einträge anlegen.

Beispiel, wenn du ein Pascal program damit aufrufst dann sollte jeder eintrag aus Parameters genau einem eintrag aus ParamStr im Zielprogram entsprechen.

Sollte das unter windows nicht der Fall sein, ist das ein bug

Winni
Beiträge: 356
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Fragen zu TProcess

Beitrag von Winni »

Hi!

Natürlich ist das eine fiese Falle für alle, die gerade von runcommand oder process.commandline "umschulen".

Es ging hier nicht um Systax-Fetischismus - es ging darum Anwenderfehler zu verhindern.

Winni

marcov
Beiträge: 1073
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Fragen zu TProcess

Beitrag von marcov »

Winni hat geschrieben:
Fr 10. Jul 2020, 14:30
Natürlich ist das eine fiese Falle für alle, die gerade von runcommand oder process.commandline "umschulen".
]

Runcommand hat commandline und parameter.add versionen. Die commandline sind deprecated, die andere nicht.

Mein Beispiel ist also nicht deprecated. Die Gedachte hinter Runcommand ist um eine Menge einfache TProcess nutzen zu Zentralisieren. Also immer mit "large output" usw.

Mathias
Beiträge: 5039
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

Mathias hat geschrieben:
Do 9. Jul 2020, 22:58
Man kann auch stderr zu stdout umleiten (poStderrToOutPut): https://www.freepascal.org/docs-html/cu ... tions.html
Danke, dies würde mal funktionieren.
Aber die Zeile mit Fuses kommt immer noch nicht.
Das Problem mit der verschwundenen Fuses-Zeile ist leider noch nicht gelöst.
Es geht um folgende Zeile:

Code: Alles auswählen

avrdude: safemode: Fuses OK (E:FF, H:9F, L:E4)
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1480
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Fragen zu TProcess

Beitrag von Warf »

Eventuell liegt es daran das das ausgabegerät in diesem fall kein terminal ist.

Testen in bash:

Code: Alles auswählen

$> avrdude ... 2>&1 | cat
ist die ausgabe immernoch wie erwartet?

PS: der grund dafür könnte das folgende sein (avrdude -h):
-u Disable safemode, default when running from a script.

Mathias
Beiträge: 5039
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

-u bewirkt genau das Gegenteil, die Fuses Zeile erscheint auch auf der K8nsole nicht mehr.

Mit

Code: Alles auswählen

avrdude -cusbasp -pattiny2313 >&1 | cat
erscheint die Fuses Zeile-
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1480
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Fragen zu TProcess

Beitrag von Warf »

Mathias hat geschrieben:
Fr 10. Jul 2020, 18:14
-u bewirkt genau das Gegenteil, die Fuses Zeile erscheint auch auf der K8nsole nicht mehr.
Genau das mein ich ja, laut hilfe ist es automatisch aktiviert wenn das aus nem script ausgeführt wird (z.b. aus einem lazarus program). Ich denke mal das das irgendwie checkt ob es aus einer (interaktiven) shell gestartet wird, und falls nicht nimmt es an -u wäre übergeben.

Was du z.b. versuchen könntest wäre statt RunCommand('avrdude', [...], result); du RunCommand('bash', ['-c', 'avrdude', ...], result); machst. Eventuell reicht das schon, ansonsten musst du wohl mal nachschauen wie avrdude rausfindet obs ein script ist oder nicht und das dann irgendwie hacken.

Oder du verzichtest auf den safemode, denn anscheinend will avrdude das du das tust wenn du nicht aus ner konsole das startest (es ist ja nicht das die zeile verschluckt wird, der gesammte safemode ist ja deaktiviert)

marcov
Beiträge: 1073
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Fragen zu TProcess

Beitrag von marcov »

Oder vielleicht postderrtooutput versuchen ?

PascalDragon
Beiträge: 55
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Fragen zu TProcess

Beitrag von PascalDragon »

Mathias hat geschrieben:
Fr 10. Jul 2020, 08:37
sstvmaster hat geschrieben:
Fr 10. Jul 2020, 00:01
Mathias hat geschrieben:
Do 9. Jul 2020, 22:58
Hier kommt eine Warnung, dies sei deprecated.
Welche Funktion sollte man da alternativ nehmen ?

Code: Alles auswählen

  AProcess.Executable := 'avrdude';
  AProcess.Parameters.Add('-cusbasp');
  AProcess.Parameters.Add('-pattiny2313');
Steht alles hier: https://www.freepascal.org/docs-html/cu ... ocess.html
Da müsste mal das Wiki angepasst werden, dort steht über all noch "AProcess.CommandLine".
Windows ist da soweit ich weiß ein wenig eigensinniger: Alle Parameter müssen zusammen als eine Befehlszeile übergeben werden
Somit nicht ganz Plattformübergreifen ?
Wen man es so trennen müsste.
Linux:

Code: Alles auswählen

  AProcess.Parameters.Add('-cusbasp');
  AProcess.Parameters.Add('-pattiny2313');
Windoof:

Code: Alles auswählen

  AProcess.Parameters.Add('-cusbasp -pattiny2313');
:roll:
Nein, du machst für alle Betriebssysteme ein separates Add. Der Hintergrund dieser API statt Commandline ist, dass es (intern) einfacher ist die Strings für Windows zusammen zu konkatenieren, statt sie für *nix aufzudröseln, da letzteres fehleranfälliger ist. Im ersten Fall müssen "einfach" nur Anführungszeichen drum herum gemacht werden, falls ein Leerzeichen drin ist.
FPC Compiler Entwickler

Antworten