2013-02-15 14 views

Odpowiedz

42

nowsze subprocess.check_output i podobne polecenia mają zastąpić os.system. Aby uzyskać szczegółowe informacje, patrz this page. Chociaż nie mogę przetestować to na Windows, poniższe powinno działać:

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

check_output zwraca ciąg wyjściu z Twojego polecenia. Alternatywnie, subprocess.call po prostu uruchamia polecenie i zwraca status polecenia (zwykle 0, jeśli wszystko jest w porządku).

Należy również zauważyć, że w pythonie 3 ten ciąg wyjściowy jest teraz wyjściowy bytes. Jeśli chcesz to zmienić na ciąg znaków, trzeba coś takiego

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

razie potrzeby you can tell it rodzaju kodowanie wyjścia programu. Wartość domyślna to utf-8, która zazwyczaj działa dobrze, ale inne standardowe opcje to here.

+0

Działa to w systemie Windows 7. Dzięki. Zwraca \ r \ n na końcu łańcucha, więc może być konieczne usunięcie go z podciągu '[0: -2]'. –

+5

Używanie '[0: -2]' w tym celu denerwuje mnie. Jeśli ktokolwiek podejmie ten kod, aby zastosować go w kontekście innym niż Windows, z pewnością zmieni oczywiste 'dir C:' na 'ls' lub cokolwiek innego. Ale mogą z łatwością nie zdawać sobie sprawy, że '[0: -2]' należy zmienić na '[0: -1]'. Zalecałbym zamiast tego ['.rstrip()'] (https://docs.python.org/2/library/stdtypes.html#str.rstrip), który działałby na dowolnej platformie (chyba że chcesz przechwycić inne ciągłe białe znaki), a także sprawia, że ​​przyczyna zmiany ciągów jest jaśniejsza. – Mike

+0

@Mikw: Mam polecenie Windows, które jest używane do wdrażania. Wystarczy pojedyncza linia poleceń. Jak mogę wywołać to z zewnętrznego skryptu python3.4? –

8

Można użyć modułu os system method.

Wystarczy umieścić w formie łańcucha polecenia, zwracana jest wartość zmiennej okna enrivonment COMSPEC

Na przykład:

os.system („python”) otwiera okna wiersza polecenia i uruchamia interpreter Pythona

os.system('python') example

+7

Sidetip: Użyj 'alt + prtscr', aby uzyskać zrzut ekranu aktywnego okna. ;) – Anonsage

+0

Dzięki za tę wskazówkę. Chociaż dokumentacja zaleca używanie [modułu podprocesowego] (https://docs.python.org/3.4/library/os.html#os.system), uważam, że jest to bardziej pytonyczne dla prostych zadań. – 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

Refaktoryzacja odpowiedzi @ srini-beerge, która pobiera dane wyjściowe i kod zwrotny

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

Można użyć pakietu subprocess z kodem jak poniżej:

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