Jak mogę określić katalog roboczy dla popen

187

Czy istnieje sposób na określenie działającego katalogu poleceń w Pythonie subprocess.Popen()?

Na przykład:

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

Mój skrypt w języku Python znajduje się w C:\programs\python

Czy można uruchomić C:\mytool\tool.exew katalogu D:\test\local?

Jak ustawić katalog roboczy dla podprocesu?

icn
źródło
2
pamiętaj, że subprocess.call to tylko cienkie opakowanie na subprocess.Popen, a to opakowanie radzi sobie również ze wszystkimi argumentami Popena, przynajmniej o ile pamiętam :) W prostych przypadkach lepiej trzymaj się subprocess.call
shabunc

Odpowiedzi:

270

subprocess.Popen bierze cwdargument, aby ustawić bieżący katalog roboczy; będziesz także chciał uciec od ukośników odwrotnych ( 'd:\\test\\local') lub użyć, r'd:\test\local'aby ukośniki odwrotne nie były interpretowane przez Pythona jako sekwencje specjalne. Sposób, w jaki został napisany, \tczęść zostanie przetłumaczona na tab.

Twoja nowa linia powinna więc wyglądać następująco:

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

Aby użyć ścieżki skryptu Python jako cwd import osi zdefiniuj cwd za pomocą:

os.path.dirname(os.path.realpath(__file__)) 
Mark Rushakoff
źródło
2
Jaki wpływ, jeśli w ogóle, miałoby dodanie Shell = True do argumentów również na ustawienie cwd?
T. Stone,
3
@T. Kamień: w przypadku samodzielnego pliku wykonywalnego nie powinien on 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: np. Wypróbuj to w Linuksie z powłoką na dwa sposoby:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff
12
Przynajmniej w Pythonie 3 nie musisz używać ukośników odwrotnych nawet na komputerze z systemem Windows, właśnie to zrobiłem subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")i działa dobrze
mgrandi
7
Czy katalog roboczy musi być ścieżką bezwzględną?
DXsmiley
10
Działa również dla subprocess.check_output (). Dzięki !
Samuel Dauzon,