2010-05-09 11 views
5

Estoy trabajando en un script simple de Python que puede usar subprocess y/o os para ejecutar algunos comandos, lo que funciona bien.cd ¿Terminal en un directorio determinado después de ejecutar un script de Python?

Sin embargo, cuando el script finaliza Me gustaría cd la terminal real (en este caso OS X) por lo que en la salida, los nuevos archivos están listos para utilizarse en el directorio en el que se han creado. Todo lo siguiente (subprocess.Popen, os.system, os.chdir) puede hacer lo que quiero de dentro la secuencia de comandos (es decir, que ejecutan cosas en el directorio de destino), pero al salir salir de la Terminal en el propio directorio del script , no el objetivo directorio.

Me gustaría evitar escribir un script de shell en el archivo temporal solo para lograr esto, si esto es posible de todos modos?

Respuesta

10

Lamentablemente, no. Los procesos no pueden cambiar el entorno de su proceso principal y, en este caso, su secuencia de comandos de Python es un proceso secundario del shell. Podrías "fingirlo" haciendo que tu proceso de Python configure un nuevo shell - call subprocess para abrir un proceso de shell y presentarlo al usuario, heredando el entorno modificado de sí mismo, pero eso tiene el inconveniente de forzar el proceso de Python para ejecutarse continuamente.

Esto es realmente lo que los scripts de shell son para .. :-) Alguien claramente necesita escribir un shell más tradicional (por ejemplo, más cercano a Bash que IPython) que puede usar python como lenguaje de scripting.

+0

Gracias - Volveré a escribir como un script de shell, y llamaré a Python desde allí :-) –

+0

No necesita dejar el intérprete de Python dando vueltas. Solo necesita obtener el entorno de proceso de la manera que lo desee (por ejemplo, 'os.chdir()') y luego 'os.execv()' un nuevo shell. Sí, todavía tendrá un shell subordinado ejecutándose, pero el intérprete de Python habrá sido reemplazado. http://docs.python.org/library/os.html#os.execv – msw

+0

@msw: nunca he sido capaz de sacar eso de forma confiable en todas las plataformas con shells en particular (específicamente powershell), pero debería tener sugerido que. –

1

¿Has probado simplemente ejecutar el programa en el shell actual?

es decir

$. script.py

en lugar de

$script.py

+0

sí, y no - el mismo problema, pero ¡gracias! –

+1

No se puede ejecutar un script ** sin shell ** en el shell actual. El prefijo de punto no hace diferencia en este caso. – tzot

4

Olvidando a Python por el momento, ningún subproceso puede cambiar el estado de su capa invocadora. Por lo tanto, necesitas un constructo que modifique el estado del caparazón de llamada, que es lo que Paul Creasey insinuaba.

alias mycd="cd `echo $1`" 

donde echo podrían ser reemplazados con script_which_outputs_a_directory_name_on_stdout.py Es una especie de un corte, pero al menos es un viejo truco.

+0

Veo lo que quieres decir; sin embargo (si no reescribo es como un script de shell), creo que imprimiré 'cd [path_to_dir]' al final para que pueda ser copiado a la línea de comando. –

Cuestiones relacionadas