2009-11-06 9 views
136

Czy istnieje sposób określenia bieżącego katalogu polecenia w Python's subprocess.Popen()?Określanie katalogu roboczego dla popen

Na przykład:

Popen('c:\mytool\tool.exe',workingdir='d:\test\local') 

My Python skrypt znajduje się w C:\programs\python

Czy jest możliwe uruchomienie C:\mytool\tool.exe w katalogu D:\test\local?

Jak ustawić katalog roboczy dla pod-procesu?

+1

pamiętać, że subprocess .call jest tylko cienkim opakowaniem w podprocesie.Popen, a to opakowanie zajmuje się również wszystkimi argumentami Popena, przynajmniej o ile pamiętam :) W prostych przypadkach lepiej trzymać się podprocesu.call – shabunc

Odpowiedz

192

subprocess.Popentakes a cwd argument do ustawienia bieżącego katalogu roboczego; będziesz także chciał uciec przed ukośnikami ('d:\\test\\local') lub użyć r'd:\test\local', aby odwrotne ukośniki nie były interpretowane jako sekwencje specjalne przez Python. Sposób, w jaki zostało to napisane, część \t zostanie przetłumaczona na zakładkę .

Więc twoja nowa linia powinna wyglądać następująco:

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local') 

Aby użyć ścieżkę skrypt Pythona jako CWD, import os i zdefiniować CWD za pomocą tego:

os.path.dirname(os.path.realpath(__file__)) 
+2

Co effe ct, jeśli w ogóle, dodaje Shell = True do argumentów na ustawieniach cwd? –

+2

@T. Kamień: Dla samodzielnego pliku wykonywalnego nie powinien niczego zmieniać, chyba że exe zależy od niektórych zmiennych środowiskowych w powłoce. Ale z 'shell = False', nie możesz użyć wbudowanej powłoki takiej jak' cd': tj. Wypróbuj to na Linuksie z powłoką w obie strony: 'subprocess.Popen (" cd/tmp; pwd ")' –

+1

thanks dużo! To działa jak urok! – icn

Powiązane problemy