2012-02-17 2 views
8

与えられたコマンドでPythonで新しいsubprocessを生成すると(私はpythonコマンドでPythonインタプリタを起動します)、どのように新しいデータを(STDIN経由で)プロセスに送ることができますか?サブプロセスを有効にして、コマンドを与え続けますか? Python

+1

それはあなたがpexpect'は、この種のものに最適です '、との対話を自動化したいシェルの場合。 – wim

答えて

8

標準subprocessモジュールを使用してください。プロセスを開始するにはsubprocess.Popen()を使用し、バックグラウンドで(つまりPythonプログラムと同時に)実行します。 Popen()を呼び出すときは、stdin、stdout、およびstderrの各パラメータをsubprocess.PIPEに設定することをお勧めします。次に、返されたオブジェクトのstdin、stdout、およびstderrフィールドを使用して、データの書き込みと読み取りを行うことができます。

未テストのコード例:

from subprocess import Popen, PIPE 

# Run "cat", which is a simple Linux program that prints it's input. 
process = Popen(['/bin/cat'], stdin=PIPE, stdout=PIPE) 
process.stdin.write(b'Hello\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'Hello\n' 
process.stdin.write(b'World\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'World\n' 

# "cat" will exit when you close stdin. (Not all programs do this!) 
process.stdin.close() 
print('Waiting for cat to exit') 
process.wait() 
print('cat finished with return code %d' % process.returncode) 
+0

これで、一度に複数のプロセスを実行する必要があるとします。 'Popen()'や 'fork 'を使って多くのサブプロセスを生成する方が良いでしょうか? – n0pe

+1

Popenはプロセスをフォークします。これは、自分で低レベルのフォークを実行するかどうか、または高レベルのライブラリでラップするかどうかの質問に過ぎません。最終結果はまったく同じです。 –

+0

だから、複数の同時ポピュンがシステムを駄目にすることはありませんか?ありがとう、私はこれを試してみましょう。 – n0pe

0

複数のコマンドを起動するためにSubprocessによって作成されたトンネルを有効にすることはできません。これを達成するために、サブプロセスのstdin、stdout、stderrのような他のもののためにparamikoを見ることができます。このリンクpython subprocessを読むことができます。これは最初のpythonプロジェクトです。

3

しないでください。

サブプロセスにコマンドを送信する場合は、ptyを作成し、ptyの一端をSTDINに接続してサブプロセスをforkします。 PTYが、それはエラーメッセージではなく、送信コマンドを受け取るのでstderrに装着され、このコードで

RNULL = open('/dev/null', 'r') 
WNULL = open('/dev/null', 'w') 

master, slave = pty.openpty() 
print parsedCmd 
self.subp = Popen(parsedCmd, shell=False, stdin=RNULL, 
         stdout=WNULL, stderr=slave) 

が、原理は同じである:ここでは

は、私のコードの一部からの抜粋です。

+1

subprocessでpty.openpty()を使用しないでください。これは複雑です。 subprocess.PIPEを使用して、サブプロセスモジュールがそれを処理するようにします。 (よりシンプルで標準的であるだけでなく、PTYよりも軽いパイプを使用します)。 – user9876

関連する問題