通常、STDIN/STDOUT を介したデータの受け渡しは簡単なので、これは大きな問題ではありません。
しかし、私は差分ユーティリティに取り組んでおり、これには 2 つの入力と 1 つの出力があります。
検討:
diff <(curl 'http://google.com') <(curl 'https://google.com')
5c5
< <A HREF="http://www.google.com/">here</A>.
---
> <A HREF="https://www.google.com/">here</A>.
open(sys.argv[1], 'r').read()
argv[1] と argv[2] の両方のデータを正常に取得できるため、これは単純な古い python プログラムで問題ありません。
問題は、私の差が google_diff_match_patch の C++ 実装であり、物事を単純にするために、そのプログラムを呼び出していることです (これは、 、、およびargv
を使用して s を読み取ります)。wifstream
wstring
getline
したがって、今起こらなければならないことは、 my/dev/fd/11
を myに「与える」必要があるということですが、パス (通常はそうです)をC++ プログラムへの引数としてsubprocess.Popen(['dmp'])
詰め込むことができないようです。 python プログラムの./dev/fd/11
/dev/fd/12
dmp
/dev/fd/11
/dev/fd/11
問題をさらに混乱させるにはfile
、「バイナリファイル」オラクルとして使用しているため、ファイルを子に送信する前にファイルの内容を読み取る必要があります。
file_process = Popen(['file', '-'], stdin=PIPE, stdout=PIPE)
file_content = open(filename, 'r').read()
(filetype, err) = file_process.communicate(file_content)
if filetype.find('text') == -1:
# Popen my c++ program and try to feed it file_content
「ファイルに書き込む」などの回答はしないでください。これらの入力リダイレクト fifo を実装して、プログラムを他のコマンド ライン diff と同じくらい効果的に使用できるようにしたいと考えていcurl
ます (たとえば、ファイルに保存せずにネットから何かを ing することも含まれます)。
編集:引数がデフォルト値のFalseの場合、子によるとsubprocess
、ファイル記述子を継承する必要があります。close_fds
さて、これは、私のpythonラッパープログラムで呼び出しopen('/dev/fd/11')
て閉じず、 を使用して子をフォークした場合Popen()
、その子は何らかの形でファイル記述子11を読み取ることができるはずであることを示しているようです。
では、Python のファイル記述子 11 の内容を取得したので、子供が読み取るファイルをどのように設定すればよいでしょうか? たとえば、シェルの機能を複製する方法( and<(echo file contents)
を使用せずに、今すぐ実行する必要があることを認識しています)shell=True
echo