1

質問は、コマンド ライン シミュレーターのような Python サブプロセス モジュールの使用に関連している可能性があります。

このようなアプリケーションのシェル コマンドを渡すことができる my_shell というインフラストラクチャ コードを作成しました。

class ApplicationTestShell(object):
    def __init__(self):
        '''
        Constructor
        '''
        self.play_ground_dir = "/var/tmp/MyAppDir" 
        ensure_dir_exists_and_empty(self.play_ground_dir)

    def execute_command(self, command, on_success = None, on_failure = None):
        p = create_shell_process(self, self.play_ground_dir)
        sout, serr = p.communicate(input = command)
        if p.returncode == 0:
            on_success(sout)
        else:
            on_failure(serr)

    def create_shell_process(self, cwd):
        return Popen("/bin/bash", env= {WHAT DO I DO HERE?},cwd = test_dir, stdout=PIPE, stderr=PIPE, stdin=PIPE)

ここで興味深いのは、env パラメータです。Python は、すべての環境変数の「マップ」データ構造のようなものを想定しています。私のアプリケーションでは、いくつかの変数をエクスポートして設定する必要があります。設定およびエクスポート用のスクリプトは、say '/bin/appload myapp' を実行することによって生成されます (appload がパスで常に利用可能であると仮定します)。私が現在行っていることは、p.communicateを呼び出すときに次のことを行うことです

p.communicate(input = "eval `/bin/appload myapp`;" + command)

したがって、基本的にコマンドを実行する前に、インフラストラクチャのセットアップを呼び出します。

  1. Pythonでこれをより良い方法で行う方法はありますか? シェル作成プロセスの一部として、または Popen クラスの env パラメータに eval /bin/appload 部分をプッシュしたいと考えています。
  2. 現在の実装にはどのような問題がありますか? (ハッキーだと思いますが、間違っているかもしれません)
4

1 に答える 1

1
  1. 働き方次第/bin/appload myappです。bash構文を出力することが保証されるだけの場合、環境オブジェクトを構築するためにPythonでその出力を解析することは、価値があるよりも多くの問題があることはほぼ確実です(パラメータと変数の展開、サブシェル、プロセス置換などをサポートする必要があるかもしれません)など)。一方、 が/bin/appload myapp" " の形式の行しか出力しないことが確実な場合VARIABLENAME=somewordは、Python で解析するのは非常に簡単で、必要に応じて Python コードに移動することもできます。

    これらの要件で進むことができるさまざまな方向が非常に多くあります。の出力を一時ファイルにキャプチャしappload myapp、サブプロセス$BASH_ENVをそのファイル名に設定できます。これにより、コマンドを実行する前に、シェルが環境設定をソーシングするようになります。and passの最初の引数としてコマンド ( eval-ing プレフィックス付き) を指定し、それ自体で呼び出しを行うことができます (必要に応じて明示的に bash に設定します)。bash のオプションを使用して、標準入力ではなくコマンド ラインで実行するコードを指定できます。Python からシェルを呼び出すことにより、多層アプローチを使用できます。Popenshell=TruePopenbash$SHELL-cappload myapp環境を実行し、その下に exec の別のシェルを配置することで、最初のシェルが ps リストに表示されず、指定されたコマンドcreate_shell_processがシェル自体を完全に保持するようにします (ただし、それは実際には重要ではありません)。appload myappシェルの呼び出し方法、ps リストでの表示方法、評価時に出力がエラーを生成した場合にコマンドを引き続き実行するかどうかに関する懸念に応じて、多くのことを行うことができます。などしかし、一般的な解決策としては、あなたが持っているものはまったく問題ないと思います。

  2. おそらくコードをコピーして貼り付けることからのみ生じた表面的なものやマイナーなものを除いて、実装に実際の問題は見られcreate_shell_processません。パラメーターを使用せずcwdon_successおよびon_failureパラメーターはオプションのように見えますが、デフォルトは物事を壊します( を呼び出すことはできませんNone)。

于 2013-03-05T18:02:21.423 に答える