3

Pythonスクリプトから(ArcGISツールとして)呼び出されるFORTRANプログラムがあります。配列Raster_Z(i、j)をFORTRANからpythonに渡す必要があります。

Pythonサブプロセスモジュールについて読みました; しかし、私はFORTRANでこれを行う方法を理解するのにあまり幸運がありませんでした。私が見つけたすべての例は、実際のプログラムではなく、単純なunixコマンドライン呼び出しを含んでいます。

誰かがメモリパイプを介してFORTRANからPythonに変数を渡す経験がありますか?

お時間をいただきありがとうございます。

4

2 に答える 2

1

モジュールからPIPEを介して配列をFORTRANにsubprocess渡すには、コマンドライン引数としてこの配列をFORTRANに渡す方法を理解する必要があります。これは、PIPEがシェルのようなインターフェイス(または必要に応じて実際のシェル)を使用してプログラムを呼び出すためです。あなたのアプローチを使用するために、私は次のようなPythonリストを作成します。

arguments = [rows, columns] + [x for x in Raster_Z.flatten()]

numpyを使用していると仮定しました。このリストは、STDINにパイプすることができます。このように、メモリを割り当てることができるように配列の行と列の数をFORTRANに指示すると、フラット化された配列が読み込まれ、適切と思われる形に変更できます。配列をフラット化すると、配列の行順から列順のストレージへの厄介な変換を削除できるという追加の利点があります。

私は実際に、PIPEを使用して、あなたが探していることを正確に実行しました。ただし、STDINを介して配列をFORTRANルーチンにパイプする代わりに、一時ファイルに書き込み、ファイルを介してFORTRANから読み込みました。私は当初、上記で提案したことを実行しようとしましたが、FORTRANがSTDINから大量のデータセットを読み取る際に問題が発生しました...これはバッファリングに起因すると考えられます。あなたのマイレージは変わるかもしれません、そして、STDINはあなたのために働くかもしれません。

また:

f2pyを使用してFORTRANルーチンをラップし、Python関数であるかのように配列をFORTRANに直接送信できます。PIPEは必要ありません!。

于 2012-05-30T14:07:29.947 に答える
0

データを fortran に /into/ fortran にも渡していますか、それともそのまま渡していますか? 可能であれば、fortran への入力用で、Intel コンパイラを使用している場合は、パイプを使用しないことをお勧めします。この質問に対する私の回答を確認してください: https://stackoverflow.com/a/10103339/1024514

一時ファイルの方がおそらくうまく機能します。データを書き込んだ直後に読み取った場合、データは OS バッファから取得される可能性があります。または、python から fortran 関数を呼び出して配列を使用するラッパーを作成します。ただし、python では実行していません。

于 2012-05-30T18:47:51.900 に答える