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
答え2
Pythonsubprocess.Popen()
オプションの名前付きパラメーターを受け入れます。shell
True
、シェルを介してコマンドラインを実行するように設定できます。
これがない場合(デフォルト)、raw引数で指定された文字列をコマンドに渡します。これにより、コマンドラインを単一の文字列として提供する必要があります。例えばsubprocess.run()
:
# raw strings, no shell
>>> proc = subprocess.run(["echo", "$$"])
$$
# with the shell
>>> proc = subprocess.run("echo shell pid is $$", shell=True)
shell pid is 14897
# this passes the first as the shell command line and others as $0, $1, $2
>>> args=['echo "$# args, arg #2 is: $2"', "sh", "abc", "def"]
>>> proc = subprocess.run(args, shell=True)
2 args, arg #2 is: def
だからあなたは欲しいかもしれません
command = "nc -1 -l 10099 > /tmp/files/copy_file_2_10099"
proc = subprocess.Popen(command,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
または、リダイレクトを直接処理することもできます。 Pythonでファイルを開きますstdout
。