2

私は現在、Python を使用してチーム向けにいくつかのコンポーネント テストを作成しようとしていますが、テスターに​​ csh ファイルをソースするように指示するテスト手順に出くわしました。このファイルには、一連の setenv コマンドとエイリアスが含まれています。これらの環境変数はすべて、チェーン内の次の実行可能ファイルで必要になります。すべての環境変数を抽出して、チェーン内の次のプロセスに渡す方法を考案したかったのです。

次の質問を見ましたが、これはほとんど私が必要としているものです: Python で Bash 'source' をエミュレートする

エクスポートされたすべての bash 環境変数をディクショナリにプッシュし、それを次のプロセスに渡すことができます。問題は、これexportは cshsetenvコマンドでは機能しないように見えることです。

これが不可能な場合、次のようなサブプロセス コマンドを使用して .csh ファイルを実行し、/bin/sh -c script.cshそれらの環境変数を必要とするプロセスをそのプロセスのサブプロセスとして実行する方法はありますか (その環境変数を継承できるようにしますか?)

基本的に、一連の setenv 変数を持つプロセスとスクリプトがあり、そのプロセスは、これらすべての環境変数を含む環境で実行する必要があります。

助けてくれてありがとう、

4

4 に答える 4

0

特定の環境変数を設定するコマンドがscript.csh含まれています。setenv

/bin/sh -c script.cshスクリプトを実行するだけです。スクリプトが終了するとすぐに、環境変数は失われます。script.cshそれでも実行可能であることを前提としています。出典を明示することを意図しているのであれば、そうする必要はありませんし、おそらくそうすべきではありません。

環境変数の設定を表示するには、csh プロセスによってscript.csh供給される必要があります。

大まかな概要は次のとおりです。

/bin/csh -c 'source script.csh ; python -c ...'

プロセスはpython -c ...環境変数を見ることができます。上記のコマンドを実行するプロセスはそうしません。

より複雑なソリューションは次のようになります。

printenv > before.txt
/bin/csh -c 'source script.csh ; printenv' > after.txt

次に、比較before.txtafter.txtて、環境で何が変わったかを確認します。(または、他の方法で出力をキャプチャすることもできます。)これには、呼び出しプロセスが変更された環境を確認できる、または少なくともそれに関する情報を取得できるという利点があります。

まれに、 の出力から環境を特定できない場合があることに注意してくださいprintenv。たとえば、 の値が の場合、$FOO"10\nBAR=20"のように出力に表示さprintenvれます。

FOO=10
BAR=20

のよう$FOOに見えます。(実際には、環境変数の値に改行が含まれることは珍しくありません。myは現在、21 行のテキストのチャンクに設定されています。10$BAR20$TERMCAP

printenv環境の明確な表現を出力する独自の置換を作成することで、これを回避できます。

于 2013-05-24T22:54:37.237 に答える
0

これは、シェルスクリプト(他のシェルスクリプトを呼び出す)から環境を取得するために機能します。このようなことを行って環境を辞書に読み込み、os.environ を使用して環境を変更することができます。

    サブプロセスのインポート

    SAPENVCMD = "/bin/csh -c \'source ~/.cshrc && env\'"
    envdict = {}

    def runco​​mmand(コマンド):
        ps = サブプロセス.Popen(コマンド,シェル=True,stdout=サブプロセス.PIPE,stderr=サブプロセス.PIPE)
        アウト、エラー = ps.communicate()
        outlist = out.split('\n')
        ps.returncode == 0 の場合:
           アウトリストを返す
        そうしないと:
           返却なし

    def elist2dict(辞書、リスト):
        リストのエントリ:
            エントリが None でない場合:
               pos = entry.find('=')
               キー = エントリ[:pos]
               位置 += 1
               値 = エントリ[位置:]
               dict.setdefault(キー、値)

    def env2dict (辞書、ENVCMD):
        envlist = runco​​mmand(ENVCMD)
        elist2dict(dict,envlist)


    env2dict(envdict,SAPENVCMD)

    v = envdict["SAPSYSTEMNAME"]
    v を印刷


于 2018-11-07T16:30:16.103 に答える
0

これを行う最も簡単な方法はcsh、セットアップ スクリプトをソースにしてから、他のスクリプトを実行することです。例えば:

setup.csh:

setenv foo bar

スクリプト.csh:

echo $foo

ランナー.py:

import subprocess
csh_command = 'source ./setup.csh && ./script.csh'
subprocess.check_call(['/bin/csh', '-c', csh_command])

リンクされた質問のコードを使用したいだけの場合は、正規表現を変更するだけです。に置き換え、exportをに置き換えるだけです。setenv=\s+

于 2013-05-24T22:50:39.990 に答える