cmd.exe mit subprocess starten, will nicht wirklich

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
BW
User
Beiträge: 25
Registriert: Dienstag 20. März 2007, 10:25

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
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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BW
User
Beiträge: 25
Registriert: Dienstag 20. März 2007, 10:25

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
BW
User
Beiträge: 25
Registriert: Dienstag 20. März 2007, 10:25

Hi Gerold,

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

Barbara
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BW
User
Beiträge: 25
Registriert: Dienstag 20. März 2007, 10:25

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
BW
User
Beiträge: 25
Registriert: Dienstag 20. März 2007, 10:25

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
Antworten