Wie rufe ich korrekt ein externes Programm auf

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drnicolas
User
Beiträge: 105
Registriert: Sonntag 24. Juli 2016, 10:32

Ich habe hier eine Batch-Datei, in der ein Tool aufgerufen wird.
Dem Tool wird die Nummer eines COM-Ports übergeben sowie jeweils ein Paar aus einem Befehl und einem Dateipfad
Das sieht in etwa so aus:

Code: Alles auswählen

c:\med7net\WinCrd2XML.exe -P %port% -S c:\med7net\egk1.xml -p c:\med7net\egk2.xml -a c:\med7net\egk3.xml -g c:\med7net\egk4.xml -R c:\med7net\egk5.xml -M 1 -K c:\med7net\daten.xml -C 1 -V c:\med7net\eGK_MFEF_Version.xml
In einer cmd-umgebung aufgerufen macht das Programm exakt das was es soll - es liest Kartendaten aus einem Kartenleser und legt verschiedene Daten in einzelne Files. Danach sind die Kartendaten vom Leser verschwunden

Dies versuche ich nun als Python-Programm nachzubilden
Leider funktioniert es nicht (ganz). Ich kann erkennen, das auf den Kartenleser zugegriffen wird, aber die Dateien sind dann leer und die Daten verschwinden nicht.

Was mache ich falsch?

Code: Alles auswählen

       result=subprocess.run(['c:/med7net/WinCrd2XML.exe', '-P' , '3','-S','c:/med7net/egk1.xml', '-p', 'c:/med7net/egk2.xml',
          '-a', 'c:/med7net/egk3.xml', '-g', 'c:/med7net/egk4.xml', '-R', 'c:/med7net/egk5.xml', '-M', '1',
          '-K', 'c:/med7net/daten.xml', '-C', '1', '-V', 'c:/med7net/eGK_MFEF_Version.xml'] , 
            stdout=subprocess.PIPE, stdin=subprocess.PIPE)
result.returncode enthält dann einen Fehlercode; ändere ich die 3 in etwas anderes, dann kommt ein anderer Fehlercode. insofern scheint das wenigstens richtig zu sein.

Es hat auch schonmal funktioinert, ich weiß aber nicht ob und was ich geändert habe.

Interessanterweise scheint es zu funktionieren, wenn ich das Programm aus der cmd-Umgebung direkt aufrufe.
Benutzeravatar
grubenfox
User
Beiträge: 612
Registriert: Freitag 2. Dezember 2022, 15:49

was macht:

Code: Alles auswählen

result=subprocess.run('c:/med7net/WinCrd2XML.exe -P 3 -S c:/med7net/egk1.xml -p c:/med7net/egk2.xml -a c:/med7net/egk3.xml -g c:/med7net/egk4.xml -R c:/med7net/egk5.xml -M 1 -K c:/med7net/daten.xml -C 1 -V c:/med7net/eGK_MFEF_Version.xml' , shell=True)
            
mangels eigener Erfahrung mit der run-Methode nur eine Vermutung dass sich mit 'shell=True' etwas wesentliches ändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Bitte nicht. Da wird etwas wesentliches verändert: Man startet nicht mehr das Programm, sondern eine Shell, der dann diese Zeichenkette als Kommando übergeben wird, und die dann das Programm ausführt. Mit all den Problemen die sich daraus ergeben. Das sollte man nur machen wenn man tatsächlich die Shell dazwischen *braucht*, was nur selten der Fall ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@drnicolas: Bist Du denn sicher das Port 3 korrekt ist? Was ist denn der Wert von ``os.environ["port"]``?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
grubenfox
User
Beiträge: 612
Registriert: Freitag 2. Dezember 2022, 15:49

drnicolas hat geschrieben: Dienstag 20. Dezember 2022, 14:02 In einer cmd-umgebung aufgerufen macht das Programm exakt das was es soll - es liest Kartendaten aus einem Kartenleser und legt verschiedene Daten in einzelne Files. Danach sind die Kartendaten vom Leser verschwunden
@ __blackjack__: in der Shell bzw. cmd-Umgebung scheint das Prgramm ja exakt das zu machen was es soll.

Wobei ich diesen Teil
drnicolas hat geschrieben: Dienstag 20. Dezember 2022, 14:02 Interessanterweise scheint es zu funktionieren, wenn ich das Programm aus der cmd-Umgebung direkt aufrufe.
nicht einordnen kann... ich gehe davon aus dass beim unteren Zitat mit dem 'Programm' das Python-Programm und nicht das WinCrd2XML.exe gemeint ist. Das ist wohl das Programm aus dem ersten Zitat.

Aber wenn das ohne Shell geht, gerne. Solche Probleme kommen auf mich vielleicht auch noch zukünftig zu...
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

@grubenfox ich denke __blackjack__ wollte nicht sagen, dass 'shell=True' nicht funktioniert oder ein fallsches Ergebnis liefert, sondern auf die Gefahren damit hinweisen. Die findet man auch häufig im Netz, z.B. hier. Falls ich dich falsch verstanden habe, ist der Link sicherlich nie verkehrt.
run hätte die Teile des Befehls auch gerne in einer Liste, dieser Teil müsste vom TE schon passen.
Dafür könnte sich shlex.split anbieten.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Liste passt schon, bis auf eben vielleicht der "%port%"-Teil der durch "3" ersetzt wurde, wo jetzt die Frage ist ob das tatsächlich der genaue Inhalt der %port%-Umgebungsvariable ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
grubenfox
User
Beiträge: 612
Registriert: Freitag 2. Dezember 2022, 15:49

Also subprocess.run mit "shell=True" liefert hoffnungsweise eine identische Umgebung wie beim händischen Aufruf. Wenn es denn mit "shell=True" und %port% geht und ohne nicht, dann scheint da irgendeine Funktionalität die die Shell einschleppt, möglicherweise noch wichtig zu sein. Wobei: cmd-umgebung liest sich für mich wie "Windows Powershell" (mit irgendwelchen cmdlet's die man da offenbar ausführt/aufrufen kann).

Von der habe ich nun genau gar keine Ahnung. außer dass in irgendwelchen Beispielen die ich gesehen hatte, die Befehle immer unnatürlich lang waren (im Vergleich zu Linux-Shells).
Aber auch bei großer Ahnungslosigkeit in Sache PowerShell erscheint mir bei genauerer Betrachtung zum einen auch nur die %port%-Angabe der Teil zu sein den eine Shell hier sinnvoll verändern könnte und zum anderen der einzige Unterschied zwischen den aufgeführten Beispielen.

Da bin jetzt auch ich bei der Frage: ist eine 3 als Portangabe wirklich korrekt bzw. was steht in der passenden Umgebungsvariablen.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

@grubenfox: Man macht aber Dinge richtig und nicht "weil sie irgendwie gehen". Wenn man eine Shell starten möchte, dann ist der Parameter richtig. Will man hier aber nicht. Und ich sehe hier auch nicht, wo du die Information gefunden hast, dass die Shell "hier etwas einschleppt". Den richtigen Tipp hat __blackjack__ schon gegeben. %port% ist eine Umgebungsvariable.

Wie du aus cmd-Umgebung "powershell" ableitest ist mir auch ein Rätsel. Eine batch-Datei und der Aufruf eines Kommandos haben nun eher weniger damt zu tun.

Also noch von einer dritten Stimme: shell=True braucht man nur, wenn man eine Shell starten will. Und auch .run will eigentlich eine Liste. Also eigentlich alles genau nicht so wie in deinem Beitrag.
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: „cmd-umgebung“ muss nicht PowerShell heissen. Die Shell die unter DOS noch ``command.com`` hiess, wurde unter Windows zu ``cmd.exe``.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
DeaD_EyE
User
Beiträge: 1242
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ich habe dir mal eine schöne Sicherheitslücke programmiert:

Code: Alles auswählen

import subprocess

verzeichnis = input("Verzeichnis auflisten: ")
subprocess.run(f"ls -l {verzeichnis}", shell=True)

Einfach mal als Pfad /home;uname -a eingeben.
Dann wird ls -l pfad ausgeführt und anschließend uname -a.

Die Shell interpretiert Leerzeichen als Trenner und ein Semikolon als neue Zeile.

Das Programm packt man am besten noch auf einen virtuellen Server und baut eine WebApp drumherum, damit man dann innerhalb kürzester Zeit unerwünschte Gäste auf dem Server hat.

Manchmal sind die Lösungen, die zu einem schnellen Ergebnis führen, besonders einfach angreifbar. Die Eingaben eines Nutzers können gefährlich sein.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten