(あまり醜い方法で...)subprocess.Popenでシェル変数を設定する方法
-
12-09-2019 - |
質問
注:これは Pythonのように、のないの同じ質問であります:サブプロセスの中に永続的なシェル変数、その質問には、環境変数ではなく、シェル変数について実際にあるように、
。私は、組み込みのtime
コマンドシェルを使用してCSHでやっていることを基本的なベンチマークを自動化しようとしています。あなたは、次のようなシェルで同じ名前の変数を設定することにより、time
の出力を微調整することができます:
set time=(1000000000 "%U %S %E %P %W %X %D %K %M %F %R %I %O %r %s %k %w %c")
しかし、これは当然のことながら、環境変数ではありませんので、あなたは(私は...その最初に試さ)env
コンストラクタでsubprocess.Popen
パラメータでそれを渡すことはできません。あなたは<全角> が(とにかく、IMO)のそれをするcmd
引数を乱用によって一緒にそれをハックして、(うまく表示するように短縮)あなたの実際の作業ができます:
time_cmd = 'set time=(1000000000 "%U %S %E %P %c"); time ./some_func'
p = subprocess.Popen(cmd, executable="/bin/csh", shell=True, ...)
、あなたが期待するよう、それは動作しますが、それは本当に行くための正しい方法ではないようだ(とあなたが別のシェルの振る舞いの束を微調整したい場合には、かなり恐ろしいcmd
の建設につながることができます)。
この場しのぎ以外subprocess
でシェル変数を設定するための他の方法はありますか?
解決
あなたは子プロセス(呼び出しの引数、環境、およびストリーム)と通信するためのオプションの数が限られています。シェル変数を設定すると、子プロセスの内部状態を変更し、より一般的な意味であるので、あなたは「その場しのぎ」は実際には非常に合理的であると呼んでいるもの。私は、シェル変数をロードする特別な方法を持っている任意のcshの変種を知りません。
しかし、あなたはパイプを経由してシェルにすべての初期化コマンドを書き、あるいはファイルに書き込むし、それらをCSHのsource
の組み込みによって読み取らせることによってそれをneatenことができます。