Mac OS X: $PATH innerhalb eines Python-Skripts ändern

Mac OS X: $PATH innerhalb eines Python-Skripts ändern

Ich habe eine Reihe von Python-Skripten. Eines davon installiert Software (Subversion), deren Pfad zu $PATH hinzugefügt werden muss. Nach der Installation möchte ich, dass das nächste Skript die Software verwendet. Wenn ich es export PATH=/opt/subversion/bin:$PATHzwischen dem ersten und zweiten Skript in Bash ausführe, ist alles in Ordnung. Wenn ich es jedoch os.system( 'export PATH=/opt/subversion/bin:$PATH' )als letzten Befehl des ersten Skripts hinzufüge (das Subversion installiert), $PATHbleibt es nach dessen Beendigung unverändert.

Gibt es eine Möglichkeit, $PATH innerhalb eines Python-Skripts zu ändern, sodass die Änderung auch nach Abschluss des Skripts bestehen bleibt (innerhalb einer einzelnen Bash-Sitzung, das ist mir natürlich bekannt /etc/profile)?

Antwort1

os.system()erzeugt eine Unter-Shell. Sie kennt Ihre vorhandene Shell also nicht.

Sie können den Pfad natürlich auch beim Ausführen des Befehls festlegen (ohne zu exportieren). Beispiel:

PATH="$PATH:/opt/subversion/bin" /command/to/run

Oh, und os.system() wird abgewertet. Sie sollten wechseln zusubprocess.Popen().

Antwort2

Das ist grundsätzlich nicht möglich. Ein Prozess kann nicht die Umgebung eines anderen Prozesses verändern.

Ein übergeordneter Prozess kann die Umgebung eines von ihm erzeugten untergeordneten Prozesses voreinstellen. Es besteht jedoch für einen Prozess keine Möglichkeit, die Umgebung eines anderen Prozesses zu beeinflussen, es sei denn, die Anwendungen sind ausdrücklich dafür ausgelegt.

Antwort3

Wie andere bereits angemerkt haben, gibt es eigentlich keine Möglichkeit, die Umgebung eines übergeordneten Prozesses zu ändern. Dazu müsste man im Speicher des übergeordneten Prozesses herumspielen, und meines Wissens gibt es dafür keine klar definierte Möglichkeit (d. h., Sie würden wahrscheinlich Ihre Shell zum Absturz bringen).

Wenn es sich bei den Skripten/Programmen, die Sie anschließend ausführen, um Python handelt, können Sie als Erstes, was Sie in diesen Programmen tun, den Pfad zu Subversion ihrer Umgebung voranstellen.

import os
os.environ['PATH'] = "/opt/subversion/bin:" + os.environ['PATH']

Oder wenn Sie immer dieselben Skripte in derselben Reihenfolge mit denselben Argumenten ausführen, packen Sie sie in ein Shell-Skript, das die Umgebung für sich selbst festlegt und diese Programme/Skripte ausführt.

Es gibt auch einen anderen Workaround: Als letztes können Sie im Skript, das Subversion installiert, diesen Prozess durch eine andere Shell ersetzen, die die gewünschte Umgebung bietet. Sie führen dann eine Bash innerhalb der Bash aus, aber das könnte ein guter Workaround sein.

#! /usr/bin/env python

# do stuff
# install subversion
# do more stuff

# at the point you exit
if everything_went_well:
  import os
  os.putenv('PATH', '/opt/subversion/bin:' + os.environ['PATH'])
  os.execv('/bin/bash', [])

verwandte Informationen