2010-05-09 10 views
5

Pracuję nad prostym skryptem w języku Python, który może używać subprocess i/lub os do wykonywania niektórych poleceń, co działa poprawnie.cd Terminal w danym katalogu po uruchomieniu skryptu Python?

Jednak po wyjściu ze skryptu chciałbym, aby cd faktycznie Terminal (w tym przypadku OS X), więc po wyjściu, nowe pliki są gotowe do użycia w katalogu, w którym zostały utworzone. Wszystko następujące (subprocess.Popen, os.system, os.chdir) może robić to, co chcę od ciągu skryptu (to znaczy wykonać rzeczy w katalogu docelowego), ale na wyjeździe opuszczenia terminalu na skryptu własnym katalogu, a nie docelowyminformator.

Chciałbym uniknąć pisania skryptu powłoki do pliku tymczasowego tylko po to, aby to osiągnąć, jeśli to w ogóle możliwe?

Odpowiedz

10

Niestety, nie. Procesom nie wolno zmieniać środowiska ich procesu macierzystego, a w tym przypadku skrypt Pythona jest procesem podrzędnym powłoki. Możesz go "sfałszować", ponieważ twój proces w Pythonie tworzy nowy podprocedura - wywołanie powłoki, aby otworzyć proces powłoki i przedstawić go użytkownikowi, dziedzicząc zmodyfikowane środowisko z samej siebie - ale ma to wadę wymuszania uruchomienia procesu Pythona nieustannie.

Tak naprawdę to są skrypty powłoki dla .. :-) Ktoś wyraźnie musi napisać bardziej tradycyjną powłokę (np. Bliżej Basha niż IPython), która może używać Pythona jako języka skryptowego.

+0

Dzięki - będę przepisywać jako skrypt powłoki i zamiast tego wywoływam Python :-) –

+0

Nie musisz zostawiać interpretera Pythona wiszącego w pobliżu. Trzeba tylko uzyskać środowisko procesowe w pożądany sposób (np. 'Os.chdir()'), a następnie 'os.execv()' nową powłokę. Tak, nadal będziesz mieć działającą podrzędną powłokę, ale interpreter Pythona zostanie zastąpiony. http://docs.python.org/library/os.html#os.execv – msw

+0

@msw: Nigdy nie byłem w stanie niezawodnie wyciągnąć tego na wszystkich platformach z powłokami w szczególności (szczególnie powershell), ale powinienem mieć zasugerował to. –

1

Czy próbowałeś po prostu uruchomić program w bieżącej powłoce?

tj

$. script.py

zamiast

$script.py

+0

tak, i nie - ten sam problem, ale dzięki! –

+1

Nie można uruchomić skryptu ** niezarzędnego ** w bieżącej powłoce. Prefiks kropki nie ma znaczenia w tym przypadku. – tzot

4

Zapominając Python na chwilę, żaden podprocesor nie może zmienić stanu jego powłoki wywołującej. Tak więc potrzebujesz konstrukcji, która zmienia stan powłoki wywołującej, o czym wspominał Paul Creasey.

alias mycd="cd `echo $1`" 

gdzie echo można zastąpić script_which_outputs_a_directory_name_on_stdout.py To rodzaj hack, ale przynajmniej jest to stary Hack.

+0

Widzę, co masz na myśli; jednakże (jeśli nie przepisuję tego jako skrypt powłoki), myślę, że wydrukuję "cd [path_to_dir]" na końcu, aby można go było skopiować do wiersza poleceń! –

Powiązane problemy