2010-05-09 10 views
5

Sto lavorando a un semplice script Python che può utilizzare subprocess e/o os per eseguire alcuni comandi, che funziona correttamente.cd Terminal in una determinata directory dopo aver eseguito uno script Python?

Tuttavia, quando lo script termina mi piacerebbe cd il Terminale attuale (in questo caso OS X) così in uscita, i nuovi file sono pronti per l'uso nella directory in cui sono stati creati. Tutto il seguente (subprocess.Popen, os.system, os.chdir) può fare quello che voglio da all'interno dello script (vale a dire che eseguono roba nella directory di destinazione), ma in uscita lasciare il terminale a proprio directory dello script , non il bersaglio directory.

Mi piacerebbe evitare di scrivere uno script di shell in un file temporaneo solo per ottenere questo, se questo è comunque possibile?

risposta

10

Purtroppo, no. I processi non sono autorizzati a cambiare l'ambiente del loro processo genitore, e in questo caso il tuo script Python è un processo figlio della shell. Potresti "fingere" facendo in modo che il tuo processo Python abbia impostato una nuova shell - chiama il sottoprocesso per aprire un processo shell e presentarlo all'utente, ereditando da sé l'ambiente modificato - ma questo ha lo svantaggio di forzare l'esecuzione del processo Python continuamente.

Questo è davvero ciò che gli script di shell sono per .. :-) Qualcuno ha chiaramente bisogno di scrivere una shell più tradizionale (ad esempio più vicina a Bash di IPython) che può usare Python come linguaggio di scripting.

+0

Grazie - Riscriverò come uno script di shell, e chiamo il Python da lì invece :-) –

+0

Non è necessario lasciare l'interprete Python in giro. Hai solo bisogno di ottenere l'ambiente di processo nel modo desiderato (ad esempio 'os.chdir()') e quindi 'os.execv()' una nuova shell. Sì, avrai ancora una shell subordinata in esecuzione, ma l'interprete Python sarà stato sostituito. http://docs.python.org/library/os.html#os.execv – msw

+0

@msw: Non sono mai stato in grado di farlo in modo affidabile su tutte le piattaforme con shell in particolare (in particolare PowerShell), ma dovrei avere ha suggerito che. –

1

Hai provato semplicemente a eseguire il programma nella shell corrente?

cioè

$. script.py

invece di

$script.py

+0

sì, e no - lo stesso problema, ma grazie! –

+1

Non è possibile eseguire uno script ** non-shell ** nella shell corrente. Il prefisso del punto non fa differenza in questo caso. – tzot

4

Dimenticato Python per il momento, nessun sottoprocesso può modificare lo stato della sua shell di invocazione. Quindi avete bisogno di un costrutto che altera lo stato della shell chiamante, che è ciò a cui stava suggerendo Paul Creasey.

alias mycd="cd `echo $1`" 

dove echo potrebbe essere sostituito con script_which_outputs_a_directory_name_on_stdout.py è una specie di un hack, ma almeno è un vecchio trucco.

+0

Capisco cosa intendi; comunque (se non riscrivo è come uno script di shell), penso che stamperò 'cd [path_to_dir]' alla fine in modo che possa essere semplicemente copiato sulla riga di comando! –

Problemi correlati