1

いくつかのシェルコマンドを発行する必要があるPythonスクリプトがあります。サブプロセスオブジェクトを作成して、実行するコマンドがあるたびにそれを再利用できると思いました。

これが私のコードの設定方法です:

def setupPipeline(self):
    setupShell = subprocess.Popen([''], stdout=subprocess.PIPE, shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

    # Stop running pipeline
    setupShell.stdin.write('stop ' + self.Name)
    output = setupShell.stdout.read()
    print output

    # Cancel any running jobs and cleanup variables
    setupShell.stdin.write('sudo -u pr cancel ALL')
    output = setupShell.stdout.read()
    print output

    setupShell.stdin.write('sudo -u pr clean ALL')
    output = setupShell.stdout.read()
    print output

(ここで他の多くのコードをスキップしてください)

if __name__ == '__main__':
#self-test code
pipelineObj = Pipeline(sys.argv)
pipelineObj.setupPipeline()

ただし、コードが2番目のコマンドに到達すると、

IOError: [Errno 32] Broken pipe

サブプロセスオブジェクトを再利用して、すべて同じシェル内で実行する必要のあるコマンドを発行するにはどうすればよいですか?各呼び出しの間に処理が行われているため、これらのコマンドを単純に連鎖させることはできません。

4

1 に答える 1

4

シェルを実行するサブプロセスを作成し、それにコマンドを送信します。シェルで空のコマンド実行しているため、シェルはその空のコマンドを実行して終了します。

shell = subprocess.Popen("/bin/bash -i".split(), stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)

pexpect代わりに、再発明に向けて順調に進んでいるように思われるので、使用を検討することもできます。

于 2012-06-22T22:54:48.267 に答える