2011-02-02 15 views
5

Używam os.system() do wykonywania poleceń powłoki wiersza poleceń systemu Windows. Chciałbym zmienić katalog bieżący Windows cmd. Oto jeden sposób to zrobić:Python: Czy można zmienić bieżący katalog powłoki wiersza poleceń systemu Windows bez zmiany bieżącego katalogu bieżącego?

os.chdir('newPath') 

Ale chdir() będzie również zmienić rzeczywiste Pythona bieżący katalog roboczy. Nie chcę zmieniać aktualnego katalogu roboczego Pythona, ponieważ chcę, aby inne części mojego skryptu działały w oryginalnym bieżącym katalogu roboczym. To, co chcę zmienić, to aktualny katalog roboczy Windowsa. Innymi słowy: chcę, aby komendy os.system() były uruchamiane w jednym bieżącym katalogu roboczym (bieżący katalog roboczy Windows cmd), podczas gdy cokolwiek innego powinno działać w innym bieżącym katalogu roboczym (aktualny katalog roboczy Pythona).

Oto kolejna próba zmiany tylko Windows cmd bieżący katalog:

os.system('cd newPath') 

jednak, że oczywiście nie działa, ponieważ tuż po wykonaniu komendy cd newPath Windows cmd bieżący katalog jest resetowany (ponieważ nie będę używał tej samej powłoki poleceń Windows w następnym wywołaniu os.system()).

Czy można mieć osobny bieżący katalog roboczy dla powłoki cmd systemu Windows? (oddzielny od bieżącego bieżącego katalogu roboczego).

+1

'Chciałbym zachować bieżący katalog roboczy, gdy tylko zmienić systemu Windows cmd aktualny spisem pracy - co? –

+0

@ BlueRaja: Masz rację. Nie byłem jasny. Po prostu zredagowałem pytanie, aby było bardziej zrozumiałe. – snakile

Odpowiedz

7

Moduł subprocess ma zastąpić os.system.

Między innymi daje on subprocess.Popen(), który pobiera argument cwd w celu określenia katalogu roboczego dla zarodkowanego procesu (dokładnie w tej sytuacji).

Patrz: http://docs.python.org/library/subprocess.html

Przykład użycia zastępując os.system:

p = subprocess.Popen("yourcmd" + " yourarg", shell=True, cwd="c:/your/path") 
sts = os.waitpid(p.pid, 0)[1] 
+0

Dzięki. Czy możesz dodać kilka słów na temat 'os.waitpid()'? – snakile

+1

@snak waitpid jest opisane w dokumencie. Można nawet zgadywać, co robi. –

+3

'retcode = subprocess.call ([" yourcmd "," arg1 "," arg2 "], shell = True, cwd =" c:/your/path ")' – Apalala

1

Jeśli ma pracować tylko w systemie Windows, może być jednym ze sposobów:

os.system('start /d newPath cmd') 
+0

dlaczego nie po prostu "zacząć cd mypath"? hoevever nie jest całkiem jasne, gdzie to pytanie się dzieje, rozważmy to, co zygdon i inni wskazali – MattiaG

+0

Myślę, że ten sam rodzaj rozwiązania dotyczy również Linuksa. –

1

Podczas korzystania os.system, nie jesteś ponowne taką samą powłokę poleceń, ale tarła nowego dla każdego żądania. Oznacza to, że nie możesz oczekiwać, że zmiany w nim będą się rozprzestrzeniać między inwokacjami.

Można jednak napisać opakowanie, które zawsze zmieni się w odpowiedni katalog przed uruchomieniem polecenia.

+0

Dzięki, ale wiem, że nie używam ponownie tej samej powłoki. Pytałem, jak przezwyciężyć ten problem i zmienić aktualny katalog Windows bez zmiany aktualnego reż. – snakile

Powiązane problemy