Pythonスクリプトでは、次のようにファイルを受信して受信するサブプロセスを実行しようとしていますncat
。
proc = subprocess.Popen(command,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
command
変数は次のリストです。
command = ['nc', '-4', '-l', '10099', '>', '/tmp/files/copy_file_2_10099']
エラーが発生します。
Ncat: Got more than one port specification: 10000 > *path to file*
>
とパス文字列をポート番号として扱うようです。どんなアイデアがありますか?
ベストアンサー1
問題は、私たちがnc
知っている限り、最後の2つのパラメータとしておよびを>
提供していることです。/tmp/files/copy_file_2_10099
モジュールのPython Popen関数はsubprocess
シェルリダイレクトを実行しないため、これら2つのパラメータを追加のパラメータとして渡します。シェルで実行するときに動作する理由は、シェルが引数をコマンド> /tmp/files/copy_file_2_10099
に渡す前に引数を解釈するため、コマンドが引数を見ることができないためです。シェルは、ファイルを開き、そのファイル記述子をコマンドの標準出力として使用する操作を処理します。
Popenにパラメータを追加することは可能ですshell=True
が、シーケンスの代わりに文字列を渡すことをお勧めします。(あなたがしたように配列)。これにより、Popenはコマンドを実行し、リダイレクトを処理するためにシェルを起動します。
純粋なPythonでコマンドの出力をキャプチャするには、stdout
Popen呼び出しに(または)引数を指定して、subprocces.Popenにファイルオブジェクトを使用するように指示できます。stderr