24

Linuxの場合シェルからPythonを呼び出すと、その環境が複製され、Pythonプロセスが開始されます。したがって、私が次のようなことをした場合:

import os
os.environ["FOO"] = "A_Value"

Pythonプロセスが戻ったとき、FOOは、元々未定義であったと仮定すると、まだ未定義のままです。Pythonプロセス(または任意の子プロセス)がその親プロセスの環境を変更する方法はありますか?

私はあなたが通常この問題を次のようなものを使って解決することを知っています

source script_name.sh

しかし、これは私が持っている他の要件と矛盾します。

4

3 に答える 3

21

親プロセス (または他の既存のプロセスの環境) を変更するプロセスはありません。

ただし、変更された環境で新しい対話型シェルを作成することにより、新しい環境を作成できます。

アップグレードされた環境を使用し、既存の stdin、stdout、および stderr にアクセスできるシェルの新しいコピーを生成し、その再初期化ダンスを実行する必要があります。

use subprocess.Popen を実行するようなことをする必要があります/bin/bash -i

したがって、元のシェルは Python を実行し、Python は新しいシェルを実行します。はい、多くのプロセスが実行されています。元のシェルと Python は、サブシェルが終了するのを待って正常に終了すること以外は何もしていないため、それほど悪くはありません。

于 2008-11-04T19:27:27.463 に答える
13

子プロセスでは、親プロセスの環境を変更することはできません。最善の方法は、シェルステートメントを出力してstdoutに出力し、それをソースにするか、親でソースするファイルに書き込むことです。

于 2008-11-04T19:12:44.203 に答える
13

私は bash eval ステートメントを使用し、Python スクリプトにシェル コードを出力させます。

child.py:

#!/usr/bin/env python
print 'FOO="A_Value"'

親.sh

#!/bin/bash
eval `./child.py`
于 2008-11-04T19:41:03.427 に答える