Seite 1 von 2

Auf Windows kommando zeile zugreifen

Verfasst: Samstag 13. Dezember 2008, 15:34
von Dango
Liebe Leute vom Python-Forum,
ich entschuldige mich im voraus, wenn meine Frage richtig "blöd" sein sollte, ich habe aber leider meistens etwas hilfe nötig.
Meine Frage wäre da :kann man mit einem python befehl einen befehl an die Windows-Komanndizeile geben? Und wenn ja bitte kurz sagen wie...
Ich bedanke mich im Voraus schon sehr herzlich bei denen die Antworten
Viele Liebe Grüße
Dango

Verfasst: Samstag 13. Dezember 2008, 15:41
von roschi
hallo Dango!

schau dir mal das modul ``subprocess`` an.

lg
roschi

PS: sowas wurde hier im forum schon oft gefragt -> http://www.python-forum.de/topic-13124.html

Verfasst: Samstag 13. Dezember 2008, 15:44
von cofi

Verfasst: Samstag 13. Dezember 2008, 18:12
von Dango
Vielen Dank für die schnelle und nette Antwort!
Welche funktion ist den nun die, wo man dann den Befehl für die Komanndozeile eingibt? Das wäre dann meine letzte Frage.
Ich bedanke mich im voraus für eine ebenso schnelle Antwort wie auf die Erste.
mit vielen Grüßen
Dango

Verfasst: Samstag 13. Dezember 2008, 18:18
von roschi
[wiki]Neue Features#Subprocess[/wiki]

ich habe nicht umsonst auf den thread verwiesen...

Verfasst: Samstag 13. Dezember 2008, 19:04
von Dango
Oh, tut mir leid. Das hatte ich jetzt nicht ganz beachtet. Aber ich bin noch ein blutiger Anfänger: gibt es vielleicht jemand der mir erklären könnte wie man jetzt z.B. der Windows Kommandozeile den Befehl "cd C://" und dann z.B. "run example.exe" gitbt?
Ich bedanke mich im voraus für eine nette,knappe und Idiotenfeste Erklärung. Vielen Dank
Mit vielen Grüßen
Dango

Verfasst: Samstag 13. Dezember 2008, 20:42
von cofi
Und warum machst du das nicht per Python?

Code: Alles auswählen

import os
import subprocess

os.chdir("C:")
subprocess.call("example.exe")

Verfasst: Samstag 13. Dezember 2008, 21:37
von Leonidas
cofi, subprocess kennt auch den Parameter ``cwd``, man braucht das Working Directory des Prozesses nicht zu ändern. Sollte man idR. auch nicht.

Verfasst: Samstag 13. Dezember 2008, 23:58
von cofi
Ah gut zu wissen ;) Hatte noch nicht die Gelegenheit `subprocess' zu benutzen.

Code: Alles auswählen

import subprocess
subprocess.call("example.exe", cwd="C:")

Verfasst: Sonntag 14. Dezember 2008, 12:18
von Dango
Vielen Vielen Dank an Alle die mir so schnell geholfen haben.
Nach etwas rumprobieren fand ich heraus das ich eher die version mit os.chdir bevorzuge, denn i-wie will mein Python nicht ganz recht wenn ich ihm dur "cwd=" den pfad vorlege. Da meckert es dann immer rum das entweder der pfad ungültig ist, die datei fehlt u.s.w aber wenn ich es mit dem os modul mache dann ist alles im Lot.
nun ich bedanke mich bei dern Herren vielmals für die schnelle Hilfe
mit vielen Grüßen
Dango

Verfasst: Sonntag 14. Dezember 2008, 12:33
von Leonidas
Dango hat geschrieben:Nach etwas rumprobieren fand ich heraus das ich eher die version mit os.chdir bevorzuge, denn i-wie will mein Python nicht ganz recht wenn ich ihm dur "cwd=" den pfad vorlege. Da meckert es dann immer rum das entweder der pfad ungültig ist, die datei fehlt u.s.w
Zeig doch bitte mal den Code, denn die ``os.chdir()``-Lösung ist eine schlechte Idee die dir möglicherweise an anderer Stelle Probleme bereiten wird.

Verfasst: Sonntag 14. Dezember 2008, 17:05
von Dango
Also die nun zum erfolg geführt hat war folgende:

Code: Alles auswählen

import os 
import subprocess
os.chdir("c:/Programme/distyingyang02")
subprocess.call("yingyang02.exe")

Verfasst: Sonntag 14. Dezember 2008, 17:28
von derdon
Dann musst du bei cwd= auch c:/Programme/distyingyang02angeben und nicht C:.

Code: Alles auswählen

import subprocess
subprocess.call("example.exe", cwd="c:/Programme/distyingyang02")

Verfasst: Sonntag 14. Dezember 2008, 17:46
von Dango
Dann kommt immmer folgendes:
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
subprocess.call("yingyang02.exe", cwd="C:/Programme/distyingyang02")
File "C:\Python25\lib\subprocess.py", line 443, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\Python25\lib\subprocess.py", line 593, in __init__
errread, errwrite)
File "C:\Python25\lib\subprocess.py", line 793, in _execute_child
startupinfo)
WindowsError: [Error 2] Das System kann die angegebene Datei nicht finden

:cry:
oder geht das einfach net unter python 2.5?

Verfasst: Sonntag 14. Dezember 2008, 17:48
von Leonidas
Müsste so gehen:

Code: Alles auswählen

import subprocess
subprocess.call([r'c:\Programme\distyingyang02\example.exe'], cwd=r"c:\Programme\distyingyang02")
Kann man auch ganz einfach erklären, warum das so ist. Und zwar wird im %PATH% unter Windows immer der aktulle Pfad geprüft um das Programm zu finden. Wenn man den Pfad ändert, dann sucht er logischerweise im neuen Ordner. Wenn man aber ``cwd`` setzt wird der ``%PATH%`` des Python-Interpreters nicht geändert sondern nur der des aufzurufenden Programms. Dieses kann aber nicht gestartet werden, da es nicht im ``%PATH%`` vorhanden ist. Also muss man den vollständigen Pfad angeben. Müsste so stimmen, habe kein Windows um das zu testen.

Verfasst: Sonntag 14. Dezember 2008, 17:51
von derdon
Ich Dödel! :oops:

Das kommt davon, wenn man immer unter Linux programmiert...
Bei Windows wird \ zum statt / benutzt. Als "normaler" String sieht das bei Python so aus:

Code: Alles auswählen

path = "c:\\Programme\\distyingyang02"
Leserlicher ist das aber als raw String:

Code: Alles auswählen

path = r"c:\Programme\distyingyang02"
@Leonidas: die Pfadangabe zu *.exe ist bei aber immer noch falsch. Entweder mit \ den Backslash escapen oder raw Strings benutzen. Bei der cwd-Angabe haste es ja richtig gemacht.

Verfasst: Sonntag 14. Dezember 2008, 17:53
von Leonidas
derdon hat geschrieben:Das kommt davon, wenn man immer unter Linux programmiert...
Bei Windows wird \ zum statt / benutzt.
Das ist egal und löst das Problem nicht. Der Win-API ist es nämlich egal ob Slashes oder Backslashes im Pfad vorkommen. Die Lösung sieht so aus wie ich geschrieben habe: einfach den vollen Pfad angeben.

Verfasst: Sonntag 14. Dezember 2008, 17:55
von Leonidas
derdon hat geschrieben:@Leonidas: die Pfadangabe zu *.exe ist bei aber immer noch falsch. Entweder mit \ den Backslash escapen oder raw Strings benutzen. Bei der cwd-Angabe haste es ja richtig gemacht.
Jein. Man sollte es machen und ich habe es editiert aber es macht keinen Unterschied in dem Fall, da weder ``\P``, ``\d`` noch ``\e`` Escape-Sequenzen sind, somit werden die ohne Änderungen weitergegeben.

Verfasst: Sonntag 14. Dezember 2008, 18:00
von derdon
Leonidas hat geschrieben:
derdon hat geschrieben:Das kommt davon, wenn man immer unter Linux programmiert...
Bei Windows wird \ zum statt / benutzt.
Das ist egal und löst das Problem nicht. Der Win-API ist es nämlich egal ob Slashes oder Backslashes im Pfad vorkommen. Die Lösung sieht so aus wie ich geschrieben habe: einfach den vollen Pfad angeben.
Ah, wieder was dazugelernt. Ganz schön schlau, diese Win-API...

Verfasst: Sonntag 14. Dezember 2008, 18:23
von Dango
Es funktioniert!! Klasse!! Danke Leonidas!
nur ne ganz kurze Frage zum Verständnis: was bedeuten die kleinen r , und warum wurde der pfad nun in eckigen Klammern geschrieben?
aber danke schon mal vielmals für die Hilfe und die Erklärung.
Mit vielen Grüßen
Dango :D :D