2010-05-09 5 views
5

Je travaille sur un simple script Python qui peut utiliser subprocess et/ou os pour exécuter certaines commandes, ce qui fonctionne très bien.cd Terminal dans un répertoire donné après avoir exécuté un script Python?

Toutefois, lorsque le script se termine, je voudrais cd le terminal réel (dans ce cas, OS X), donc à la sortie, les nouveaux fichiers sont prêts à utiliser dans le répertoire où ils ont été créés. Tous les articles suivants (subprocess.Popen, os.system, os.chdir) peut faire ce que je veux de au sein le script (ils exécutent des choses dans le répertoire cible), mais à la sortie quitter le terminal au propre répertoire de scripts , pas la cible annuaire.

Je voudrais éviter d'écrire un script shell dans un fichier temporaire juste pour y parvenir, si c'est possible de toute façon?

Répondre

10

Malheureusement, non. Les processus ne sont pas autorisés à modifier l'environnement de leur processus parent, et dans ce cas, votre script Python est un processus fils du shell. Vous pouvez le "fausser" en demandant à votre processus Python de configurer un nouveau sous-processus d'appel shell pour ouvrir un processus shell et le présenter à l'utilisateur, héritant de l'environnement modifié, mais cela a pour inconvénient de forcer le processus Python continuellement.

C'est vraiment ce que les scripts shell sont pour: :-) Quelqu'un a clairement besoin d'écrire un shell plus traditionnel (par exemple plus proche de Bash que IPython) qui peut utiliser python comme langage de script. Oubliant Python pour l'instant, aucun sous-processus ne peut changer l'état de son shell appelant.

+0

Merci - Je vais réécrire est comme un script shell, et appelez le Python à partir de là :-) –

+0

Vous n'avez pas besoin de laisser l'interpréteur Python traîner. Vous avez juste besoin d'obtenir l'environnement de processus comme vous le souhaitez (par exemple 'os.chdir()') et ensuite 'os.execv()' un nouveau shell. Oui, vous aurez toujours un shell subordonné en cours d'exécution, mais l'interpréteur Python aura été remplacé. http://docs.python.org/library/os.html#os.execv – msw

+0

@msw: Je n'ai jamais été en mesure de tirer de manière fiable sur toutes les plates-formes avec des coquilles en particulier (PowerShell en particulier), mais je devrais avoir suggéré que. –

1

Avez-vous essayé d'exécuter simplement le programme dans le shell actuel?

i.e.

$. script.py

au lieu de

$script.py

+0

oui, et non - même problème, mais merci! –

+1

Vous ne pouvez pas exécuter un script ** non-shell ** dans le shell actuel. Le préfixe de point ne fait aucune différence dans ce cas. – tzot

4

Vous avez donc besoin d'une construction qui modifie l'état du shell appelant, ce à quoi Paul Creasey faisait allusion.

alias mycd="cd `echo $1`" 

echo pourrait être remplacé par script_which_outputs_a_directory_name_on_stdout.py Il est en quelque sorte un hack, mais au moins il y a un vieux hack.

+0

Je vois ce que vous voulez dire; cependant (si je ne réécris pas est un script shell), je pense que j'imprimerai 'cd [path_to_dir]' à la fin afin qu'il puisse être simplement copié sur la ligne de commande! –