Seite 1 von 1

cmd.exe mit subprocess starten, will nicht wirklich

Verfasst: Mittwoch 26. September 2007, 14:24
von BW
Hallo zusammen,
nachdem ich jetzt schon Diverses u.a. hier im Forum gelesen habe, bin ich zumindest in der Lage mit subprocess einen Prozess zu starten.

Das was ich im Prinzip machen möchte ist aus einem GUI (wxPython) heraus eine Eingabeaufforderung zu starten, dort dann von Python aus eine Eingabe machen, so dass dann dort ein weiterer (interaktiver) Prozess abläuft. (und das ganze plattformunabhängig)

Anmerkung: auf den interaktiven Prozess habe ich keinen Einfluss und der läuft auch heute schon in einer Eingabeaufforderung.

das ist bis jetzt das wie ich es machen würde:

Code: Alles auswählen

import subprocess
import os

command = os.getenv("ComSpec") #["c:\\WINDOWS\\system32\\cmd.exe"]
process = subprocess.Popen( [command], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
process.stdin.write("cd ..\n")  # hier steht dann der Aufruf zum interaktiven Prozess
process.stdin.close()     
process.wait()                  # ich hoffe, dass hiermit gewartet wird bis der interaktive Prozess beendet ist
Aber leider passiert nicht wirklich etwas. Ich starte das aus SPE heraus und irgendwann kommt die Meldung "Script Terminated".
Wenn ich hinter process.stdin.close() ein print process.stdout.read() setze, dann bekomme ich in der Ausgabe im SPE das geschrieben, was ich in der "schwarzen Dos-Kiste" erwarten würde.

Wenn ich das Skript über die Eingabeaufforderung starte, dann wird die Ausgabe auch nicht in eine neue Eingabeaufforderung geschrieben, sondern in die bereits geöffnete.

Warum geht denn diese verflixte Eingabeaufforderung nicht auf? Wenn ich eine andere exe-Datei angebe, dann geht es.
Kann mir das einer erklären, mir sagen wo der Fehler bei meinem Vorgehen ist oder mir vielleicht einen kleinen Hinweis geben wonach ich noch suchen könnte?

Diesen interaktiven Prozess direkt zu starten, bekomme ich auch nicht hin, weil der Prozess irgendwie nicht zu einem process.stdout.read() kommt, weil kein EOF erreicht wird...

Bin für eure Hilfe sehr dankbar. Ich bin mit meinem Latein gerade am Ende.
Barbara

Verfasst: Mittwoch 26. September 2007, 15:09
von BlackJack
Ich würde mal sagen ``cmd.exe`` ist nicht die Eingabeaufforderung sondern der Kommandointerpreter der *in* der Eingabeaufforderung läuft. Genau wie die Unterscheidung Terminal(emulator), also das Fenster, und die Shell, also das was den Prompt in das Fenster schreibt und Befehle entgegennimmt und ausführt, unter Unix.

Re: cmd.exe mit subprocess starten, will nicht wirklich

Verfasst: Mittwoch 26. September 2007, 15:10
von gerold
Hallo Barbara!

Du leitest STDOUT um, liest es aber nicht aus.

Code: Alles auswählen

import subprocess
import os

command = os.getenv("ComSpec") #["c:\\WINDOWS\\system32\\cmd.exe"]
process = subprocess.Popen( [command], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
process.stdin.write("cd ..\n")  # hier steht dann der Aufruf zum interaktiven Prozess
process.stdin.close()     
print process.stdout.read()
process.wait()                  # ich hoffe, dass hiermit gewartet wird bis der interaktive Prozess beendet ist
EDIT:

Aber irgendwie funktioniert das bei mir auch *ohne* process.stdout.read(). :K

EDIT 2:

Ich glaube, ich habe die Frage falsch verstanden. :oops:

mfg
Gerold
:-)

Verfasst: Mittwoch 26. September 2007, 15:31
von BW
Hallo BlackJack,
Hallo Gerold,

vielen Dank für die super schnelle Antwort...

@ BlackJack: ähm, ja, also... aber wenn ich doch einen Doppelklick auf diese cmd.exe im Verzeichnis c:\WINDOWS\system32 mache, dann öffnet sich doch eine Eingabeaufforderung, oder etwa nicht?
(alternativer Weg: Start -> Programme -> Zubehör -> Eingabeaufforderung)
Ich dachte, dass ich mit subprocess eben genau diese exe dann starte, so als ob ich eben einen Doppelklick mache. Mit den Vorteilen, dass ich den Prozess kontrollieren und steuern kann. Habe ich da etwas falsch verstanden?
Du weißt aber nicht zufällig, wie ich diese "schwarze Kiste" starte, oder?
Denn wenn ich nur

Code: Alles auswählen

os.startfile(os.getenv("ComSpec"))
eingebe, dann öffnet sich doch die Eingabeaufforderung, also warum dann nicht auch mit subprocess?

@Gerold: öffnet sich bei dir die Eingabeaufforderung? Auf das stdout kann ich eventuell eh verzichten.

Barbara

Verfasst: Mittwoch 26. September 2007, 15:33
von BW
Hi Gerold,

die Frage kurz und knapp:
Wie starte ich eine Eingabeaufforderung (cmd.exe) mit subprocess.

Barbara

Verfasst: Mittwoch 26. September 2007, 15:45
von gerold
BW hat geschrieben:die Frage kurz und knapp:
Wie starte ich eine Eingabeaufforderung (cmd.exe) mit subprocess.
Hallo Barbara!

Nicht mit ``subprocess`` sondern mit ``os.startfile("cmd")`` startest du CMD als unabhängiges Programm.

Los, nächste kurze Frage. :wink:

lg
Gerold
:-)

Verfasst: Mittwoch 26. September 2007, 15:56
von gerold
Hallo Barbara!

Um der nächsten Frage vorzugreifen:

kommandos.cmd:

Code: Alles auswählen

cd ..
dir
cd ..
dir
starte_kommandos.cmd:

Code: Alles auswählen

@ECHO OFF
CMD /K CALL kommandos.cmd
hallo.py:

Code: Alles auswählen

import os
os.startfile("starte_kommandos.cmd")
lg
Gerold
:-)

Verfasst: Mittwoch 26. September 2007, 17:30
von BW
Hallo Gerold,

aber ist os.startfile(..) nicht nur unter Windows möglich? (kurz genug? :wink: )
Habe ich zumindest irgendwo gelesen.
D.h. ich muss das dann doch mit einem der os.popen versuchen...

(vielleicht grad mal zu meiner kleinen Verteidigung, bin kein "gelernter" Programmiere, sondern "nur" ein Dipl.-Ing. der halt auch ein wenig programmieren darf (mit Python so ca. ein Jahr) und deshalb sind mir einige Begriffe sicher nicht so geläufig, deshalb bitte ich ein wenig um Nachsicht)

LG
Barbara :D

Verfasst: Mittwoch 26. September 2007, 18:23
von gerold
BW hat geschrieben:aber ist os.startfile(..) nicht nur unter Windows möglich? (kurz genug? :wink: )
Hallo Barbara!

Ja, kurz genug. ;-)

Zumindest hast du jetztschon mal eine (hoffentlich funktionierende) Windows-Lösung. Jetzt brauchst du noch die Linux-Lösung. Diese bekommst du sicher von einem anderen hier im Board.

Mit ``sys.platform.startswith("win")`` bekommst du raus, ob dein Programm unter Windows läuft.

lg
Gerold
:-)

Verfasst: Mittwoch 26. September 2007, 19:05
von Damaskus
gerold hat geschrieben:
BW hat geschrieben:die Frage kurz und knapp:
Wie starte ich eine Eingabeaufforderung (cmd.exe) mit subprocess.
Hallo Barbara!

Nicht mit ``subprocess`` sondern mit ``os.startfile("cmd")`` startest du CMD als unabhängiges Programm.

Los, nächste kurze Frage. :wink:

lg
Gerold
:-)
Hmm... und wie beende ich cmd.exe wieder ;)

Gruß
Damaskus

Verfasst: Mittwoch 26. September 2007, 19:23
von birkenfeld
BW hat geschrieben:Hallo Gerold,

aber ist os.startfile(..) nicht nur unter Windows möglich?
Naja, os.startfile() ist da eher das kleinste Problem. Andere Plattformen haben weder eine "cmd.exe" noch hat deren Shell dieselbe Syntax und denselben Befehlsvorrat.

Verfasst: Mittwoch 26. September 2007, 19:31
von gerold
Damaskus hat geschrieben:
gerold hat geschrieben:Nicht mit ``subprocess`` sondern mit ``os.startfile("cmd")`` startest du CMD als unabhängiges Programm.
Hmm... und wie beende ich cmd.exe wieder ;)
Hallo Damaskus!

Die Betonung lag auf **unabhängig**. ;-) Du kannst auch *eigenständig*, *autark* oder *autonom* dazu sagen. Dieses Ding läuft weiter, auch wenn dein Programm schon lange das Zeitliche gesegnet hat. :lol:

Mir ist keine Möglichkeit bekannt, eine über zwei Ecken gestartete CMD fernzusteuern. Außer natürlich das Ding hart zu killen. Was aber voraussetzt, dass man die PID herausfindet.

``CMD /K`` bedeutet --> Starte angefügten Befehl und bleibe im interaktiven Modus stehen.

``CMD /C`` bedeutet --> Starte angefügten Befehl und beende CMD danach.

Vielleicht hilft dir weiter.

lg
Gerold
:-)

Verfasst: Donnerstag 27. September 2007, 05:41
von Damaskus
Hallo Gerold,
das hilft mir nicht so richtig weiter...

Ich muss in einem Py Script ein Programm starten das auf bedienung mit der Maus ausgelegt ist. (FRITZ!web) starten ist kein Problem aber beendet bekomme ich es nicht. Ich hab auch schon versucht die PID herauszubekommen und es dann zu killen, aber ich komm nicht an die PID ran.

Gruß
Damaskus

Verfasst: Donnerstag 27. September 2007, 06:42
von BW
guten morgen miteinander,

oh oh... das scheint ja schwieriger zu sein, als ich dachte mit dem externen Prozess.
Mir ist keine Möglichkeit bekannt, eine über zwei Ecken gestartete CMD fernzusteuern. Außer natürlich das Ding hart zu killen. Was aber voraussetzt, dass man die PID herausfindet.
Da muss ich wohl mal auf die Suche nach einer alternativen Lösung gehen.
Dennoch vielen Dank für die Hilfe und die Informationen.
LG Barbara

Verfasst: Donnerstag 27. September 2007, 08:16
von gerold
Damaskus hat geschrieben:Programm starten das auf bedienung mit der Maus ausgelegt ist. (FRITZ!web) starten ist kein Problem aber beendet bekomme ich es nicht.
Hallo Damaskus!

Damit kannst du "normale" Windows-Programme fernsteuern: http://www.openqa.org/pywinauto/

Es stößt allerdings an Grenzen, wenn die Macher des Programms die Programmoberfläche selber gezeichnet haben anstatt die Windows-Steuerelemente einzusetzen.

lg
Gerold
:-)

Verfasst: Samstag 29. September 2007, 12:21
von Damaskus
gerold hat geschrieben:
Damaskus hat geschrieben:Programm starten das auf bedienung mit der Maus ausgelegt ist. (FRITZ!web) starten ist kein Problem aber beendet bekomme ich es nicht.
Hallo Damaskus!

Damit kannst du "normale" Windows-Programme fernsteuern: http://www.openqa.org/pywinauto/

Es stößt allerdings an Grenzen, wenn die Macher des Programms die Programmoberfläche selber gezeichnet haben anstatt die Windows-Steuerelemente einzusetzen.

lg
Gerold
:-)
Hallo Gerold,
pywinauto ist genial! Und über das senden der Tastenkombination ALT+F4 bekomm ich Fritzweb auch sauber beendet.

Thx für die Hilfe
Gruß
Damaskus