os.environまたはcopy.deepcopyがどのように機能するかについてのドキュメントを少し見逃しただけかもしれませんが、copy.deepcopyはos.environでは機能しないようです。しかし、os.environを新しい辞書に再構築すると、正常に機能します。これが私のサンプルコードです:
import copy
import os
tcsh_loc = '/bin/tcsh'
safe_dict = {}
for key in os.environ.keys():
safe_dict[key] = os.environ[key]
safe_dict['SAFE_ENV'] = 'non-leaked-var'
os.spawnv(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $SAFE_ENV'])
os.spawnve(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $SAFE_ENV'], safe_dict)
unsafe_dict = copy.deepcopy(os.environ)
unsafe_dict['UNSAFE_ENV'] = 'leaked-var'
os.spawnv(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $UNSAFE_ENV'])
os.spawnve(os.P_WAIT, tcsh_loc, [tcsh_loc, '-c', 'echo $UNSAFE_ENV'], unsafe_dict)
私が抜け出すことを期待しているのは:
SAFE_ENV: Undefined variable.
non-leaked-var
UNSAFE_ENV: Undefined variable.
leaked-var
しかし、私が得たのは:
SAFE_ENV: Undefined variable.
non-leaked-var
leaked-var
leaked-var
これは、どういうわけか、unsafe_dict['UNSAFE_ENV'] = 'leaked-var'
割り当てがos.environに「リーク」していることを意味します。おそらく、os.environが期待どおりにディープコピーされていないためです。
これはある種の既知の動作だと思いますが、少なくともos.spawnev()のようなものを使用するという点では、私には望ましくないように思えます。不器用な回避策がありますが、何が起こっているのか、forループよりもエレガントなソリューションがあるかどうかを理解したいと思います...