2012-05-30 103 views
3

我有一個從Python腳本(作爲ArcGIS工具)調用的FORTRAN程序。我需要將一個數組Raster_Z(i,j)從FORTRAN傳遞給python。將FORTRAN變量傳遞給Python

我已閱讀關於Python subprocess module;然而,我並沒有太多的運氣來理解如何用FORTRAN做到這一點。我發現的所有示例都涉及簡單的unix命令行調用,而不是實際的程序。

有沒有人有任何通過內存PIPE從FORTRAN傳遞給Python的經驗?

謝謝你的時間。

+0

歡迎來到程序員堆棧交換馬修。這個網站是關於軟件開發*的概念性問題,而不是像這樣的具體編程問題,因此在Stack Overflow上會更好。請不要在那裏發佈你的問題,但如果人們同意,這個問題將被移植到那裏。 –

+0

如果FORTRAN中可用,我會推薦數據序列化。或者只是用Python + Numpy重寫它。 – rubik

回答

1

要通過subprocess模塊的PIPE將數組傳遞給FORTRAN,您需要弄清楚如何將該數組作爲命令行參數傳遞給FORTRAN。這是因爲PIPE使用一個類似shell的接口(或者如果你想要的話,實際的shell)來調用這些程序。要使用你的方法,我會做一個看起來像這樣的Python列表:在這裏我假設你正在使用numpy的

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

。該列表可以PIPE'd到STDIN。這樣,您可以告訴FORTRAN數組的行數和列數,以便它可以分配內存,然後它將讀取扁平數組,您可以重新組合,但是您認爲合適。展平陣列還有一個好處,就是可以從數組的行順序存儲中移除煩人的轉換。

我實際上完成了你正在使用PIPE的工作,除了不是通過STDIN將數組管道到FORTRAN例程,而是將它寫入臨時文件,然後通過文件從FORTRAN中讀取它。我原本試圖按照上面我剛剛提出的建議去做,但是我遇到了FORTRAN從STDIN讀取大量數據的問題......我將其歸因於緩衝。您的milage可能會有所不同,STDIN可能會爲您工作。

OR:

你可以使用f2py換你FORTRAN程序,然後發送數組FORTRAN直接就好像它是一個Python函數,沒有PIPEing需要!

+0

感謝您的回覆!我已經考慮過使用f2py,但是我的程序有很多模塊並且調用了其他的.F's,使用f2py將會花費很多工作,形成我所能說的。行和列的數量可能非常大,每個數量級數十萬。我會研究你的建議,並希望發佈一個完整的答案。 – 2012-05-30 14:11:39

0

你是否正在傳遞數據/進入/ fortran或剛剛出去? 如果可能的話,我會建議對管道,絕對要輸入fortran,如果你使用的是intel編譯器。看看我對這個問題的回答:https://stackoverflow.com/a/10103339/1024514

一個臨時文件可能會工作得更好 - 如果它在寫入後立即被讀取,那麼數據很可能來自OS緩衝區。或者寫一個包裝器來調用python的fortran函數來使用這個數組 - 我在python中並沒有這樣做。