質問

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

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

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

通常、次のようなものを使用してこの問題を解決することを知っています

source script_name.sh

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

役に立ちましたか?

解決

どのプロセスも親プロセス(または他の既存のプロセスの環境)を変更できません。

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

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

/ bin / bash -i を実行するには、subprocess.Popenを使用するなどの操作が必要です。

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

他のヒント

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

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

child.py:

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

parent.sh

#!/bin/bash
eval `./child.py`
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top