2010-05-09 2 views
5

Ich arbeite an einem einfachen Python-Skript, das subprocess und/oder os verwenden kann, um einige Befehle auszuführen, die gut funktionieren.cd Terminal in einem bestimmten Verzeichnis nach dem Ausführen eines Python-Skripts?

Allerdings, wenn das Skript beendet Ich möchte cd das eigentliche Terminal (in diesem Fall OS X) so beim Beenden, sind die neuen Dateien bereit, in dem Verzeichnis zu verwenden, in dem die erstellt wurden. All folgenden (subprocess.Popen, os.system, os.chdir) kann tun, was ich von innerhalb will das Skript (das heißt, sie Sachen im Zielverzeichnis ausführen), aber beim Verlassen des Terminals im Skript eigenen Verzeichnis verlassen, nicht das Ziel Verzeichnis.

Ich möchte vermeiden, ein Shell-Skript in eine temporäre Datei zu schreiben, nur um dies zu erreichen, wenn das überhaupt möglich ist?

Antwort

10

Leider nein. Prozesse dürfen die Umgebung ihres übergeordneten Prozesses nicht ändern, und in diesem Fall ist Ihr Python-Skript ein untergeordneter Prozess der Shell. Sie könnten es "fälschen", indem Sie Ihren Python-Prozess eine neue Shell einrichten lassen - Unterprozess aufrufen, um einen Shell-Prozess zu öffnen und ihn dem Benutzer zu präsentieren, erben die modifizierte Umgebung von sich selbst - aber das hat den Nachteil, den Python-Prozess zu erzwingen ständig.

Das ist wirklich was Shell-Skripte sind .. :-) Jemand muss eindeutig eine traditionellere Shell (z. B. näher an Bash als IPython) schreiben, die Python als Skriptsprache verwenden kann.

+0

Danke - ich schreibe es als Shell-Skript um, und rufe den Python stattdessen von dort :-) –

+0

Sie müssen den Python-Interpreter nicht herumhängen lassen. Sie müssen lediglich die Prozessumgebung so einrichten, wie Sie es möchten (z. B. "os.chdir()") und dann "os.exec()" eine neue Shell. Ja, Sie werden immer noch eine untergeordnete Shell ausführen, aber der Python-Interpreter wurde ersetzt. http://docs.python.org/library/os.html#os.exec – msw

+0

@msw: Ich war nie in der Lage, das zuverlässig auf allen Plattformen mit Shells insbesondere (speziell Powershell) zu ziehen, aber ich hätte vorgeschlagen, dass. –

1

Haben Sie versucht, einfach das Programm in der aktuellen Shell auszuführen?

d.h

$. script.py

statt

$script.py

+0

ja, und nein - das gleiche Problem, aber danke! –

+1

Sie können kein ** Nicht-Shell ** -Skript in der aktuellen Shell ausführen. Das Punktpräfix spielt in diesem Fall keine Rolle. – tzot

4

Wenn Sie Python für den Moment vergessen, kann kein Subprozess den Zustand seiner aufrufenden Shell ändern. Sie brauchen also ein Konstrukt, das den Zustand der aufrufenden Hülle verändert, worauf Paul Creasey hinwies.

alias mycd="cd `echo $1`" 

wo echo mit script_which_outputs_a_directory_name_on_stdout.py ersetzt werden könnten Es ist irgendwie ein Hack, aber zumindest ist es ein alter Hack.

+0

Ich sehe was du meinst; Allerdings (wenn ich das nicht als Shell-Skript umschreibe), denke ich, dass ich 'cd [path_to_dir]' am Ende ausdrucken werde, damit es einfach in die Befehlszeile kopiert werden kann! –