「ncat」は、Pythonスクリプトで実行すると、リダイレクトを(追加)ポート仕様として扱います。

「ncat」は、Pythonスクリプトで実行すると、リダイレクトを(追加)ポート仕様として扱います。

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でコマンドの出力をキャプチャするには、stdoutPopen呼び出しに(または)引数を指定して、subprocces.Popenにファイルオブジェクトを使用するように指示できます。stderr

おすすめ記事