Mac OS X: Python スクリプト内から $PATH を変更する

Mac OS X: Python スクリプト内から $PATH を変更する

Python スクリプトがたくさんあります。そのうちの 1 つは、$PATH にパスを追加する必要があるソフトウェア (Subversion) をインストールします。インストール後、次のスクリプトでそのソフトウェアを使用するようにします。最初のスクリプトと 2 番目のスクリプトの間で bash を実行すると、すべて正常です。ただし、最初のスクリプト (Subversion をインストールする) の最後のコマンドとしてexport PATH=/opt/subversion/bin:$PATH追加すると、終了した後も変更されません。os.system( 'export PATH=/opt/subversion/bin:$PATH' )$PATH

Python スクリプト内から $PATH を変更して、スクリプトが終了した後も変更されたままにする方法はありますか (もちろん、単一の bash セッション内については知っています/etc/profile)。

答え1

os.system()サブシェルを生成します。そのため、既存のシェルについての知識はありません。

もちろん、コマンドを実行するときにパスを(エクスポートせずに)設定することもできます。例:

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

ああ、os.system()は廃止される予定です。subprocess.Popen()

答え2

通常、それは不可能です。 1 つのプロセスが別のプロセスの環境を変更することはできません。

親は、生成する子プロセスの環境を事前に設定できますが、アプリケーションがこれを許可するように特別に設計されていない限り、あるプロセスが別のプロセスの環境に影響を与える方法は実際にはありません。

答え3

他の人が指摘しているように、親プロセスの環境を変更する方法は実際には存在しません。親プロセスのメモリ内をいじくり回す必要があり、私の知る限り、これを行うための明確な方法はありません (つまり、シェルがクラッシュする可能性があります)。

後で実行するスクリプト/プログラムが Python の場合、それらのプログラムで最初に行うこととして、その環境の先頭に Subversion へのパスを追加できます。

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

または、常に同じ引数を使用して同じ順序で同じスクリプトを実行する場合は、スクリプト自体の環境を設定し、それらのプログラム/スクリプトを実行するシェル スクリプトにスクリプトをラップします。

他にも回避策があります。Subversion をインストールするスクリプトの最後の部分で、そのプロセスを、必要な環境を持つ別のシェルに置き換えることができます。bash 内で bash を実行することになりますが、これは良い回避策になるかもしれません。

#! /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', [])

関連情報