2013-02-15 1 views
26

Wie können wir mit Python mit der Betriebssystem-Shell interagieren? Ich möchte Windows Cmd-Befehle über Python ausführen. Wie kann es erreicht werden?Windows-Shell-Befehle mit Python ausführen

+1

Verwandte: [ Ist es möglich, Python als Shell-Ersatz zu verwenden?] (Http://programmers.stackexchange.com/q/182077) –

Antwort

42

Die neueren subprocess.check_output und ähnliche Befehle sollen os.system ersetzen. Details siehe this page. Während ich dies auf Windows nicht testen können, sollten folgende Arbeiten:

from subprocess import check_output 
check_output("dir C:", shell=True) 

check_output gibt eine Zeichenfolge der Ausgabe von Ihrem Befehl. Alternativ dazu führt subprocess.call nur den Befehl aus und gibt den Status des Befehls zurück (normalerweise 0, wenn alles in Ordnung ist).

Beachten Sie auch, dass in Python 3 diese Zeichenfolgenausgabe nun bytes ausgegeben wird. Wenn Sie dies ändern in einen String möchten, müssen Sie so etwas wie

from subprocess import check_output 
check_output("dir C:", shell=True).decode() 

Falls erforderlich, you can tell it die Art der Kodierung der Programmausgaben. Der Standardwert ist utf-8, was normalerweise gut funktioniert, aber andere Standardoptionen sind here.

+0

Das funktioniert in Windows 7. Danke. Es gibt \ r \ n am Ende der Zeichenfolge zurück, so dass Sie es möglicherweise mit einem '[0: -2]' Teilstring ausstreichen müssen. –

+5

Die Verwendung von '[0: -2]' für diesen Zweck macht mich nervös. Wenn jemand diesen Code verwendet, um ihn in einem Nicht-Windows-Kontext anzuwenden, wird er das offensichtliche 'dir C:' in 'ls' oder was auch immer ändern. Aber sie könnten leicht übersehen, dass "[0: -2]" in "[0: -1]" geändert werden sollte. Ich würde stattdessen ['.rstrip()'] (https://docs.python.org/2/library/stdtypes.html#str.rstrip) empfehlen, was auf jeder Plattform funktioniert (es sei denn, Sie möchten andere erfassen) trailing whitespace), und macht auch den Grund für die String-Änderung klarer. – Mike

+0

@Mikw: Ich habe einen Windows-Befehl, der für die Bereitstellung verwendet wird. Nur eine einzige Befehlszeile. Wie kann ich es von einem externen Python3.4-Skript aufrufen –

8

Sie würden das OS-Modul system method verwenden.

Sie nur in der Zeichenfolge Form des Befehls gesetzt, ist der Rückgabewert die Fenster Variable COMSPEC für Ökologie

Zum Beispiel:

os.system ('Python') öffnet sich der Windows-Eingabeaufforderung und läuft der python-Interpreter

os.system('python') example

+7

Sidetip: Verwenden Sie 'alt + prtscr', um nur einen Screenshot des aktiven Fensters zu erhalten. ;) – Anonsage

+0

Danke für diesen Tipp. Obwohl die Dokumentation die Verwendung von [subprocess module] (https://docs.python.org/3.4/library/os.html#os.system) empfiehlt, finde ich dieses Python für einfache Aufgaben. – Igor

0
import subprocess 
result = [] 
win_cmd = 'ipconfig'(curr_user,filename,ip_address) 
process = subprocess.Popen(win_cmd, 
shell=True, 
stdout=subprocess.PIPE, 
stderr=subprocess.PIPE) 
for line in process.stdout: 
    print line 
result.append(line) 
errcode = process.returncode 
for line in result: 
    print line 
3

Refactoring von @ srini-beerge Antwort, die die Ausgabe und den Return-Code kann

import subprocess 
def run_win_cmd(cmd): 
    result = [] 
    process = subprocess.Popen(cmd, 
           shell=True, 
           stdout=subprocess.PIPE, 
           stderr=subprocess.PIPE) 
    for line in process.stdout: 
     result.append(line) 
    errcode = process.returncode 
    for line in result: 
     print(line) 
    if errcode is not None: 
     raise Exception('cmd %s failed, see above for details', cmd) 
0

Sie das, wie unten subprocess Paket mit dem Code verwenden wird:

import subprocess 
cmdCommand = "python test.py" #specify your cmd command 
process = subprocess.Popen(cmdCommand.split(), stdout=subprocess.PIPE) 
output, error = process.communicate() 
print output