2017-03-09 53 views
0

我已經適應從這個questionFortran的DLL在Python包裝,對於相同功能的輸出變化

我的最終目標是我的代碼: - 收拾在一個DLL(已完成) 一些Fortran代碼 - 創建Python封裝器作爲接口接收來自源的輸入,並將這些輸入提供給DLL並將它們傳遞到DLL Fortran函數 - 返回函數的輸出以傳遞給另一個Python程序。到目前爲止,我一直在使用這個例子作爲原型(我最終會適應這個原型),每次都會獲得不同的輸出結果。如下圖所示

C:\Users\NAME\Desktop>python.exe py_wrapper.py 
    <CDLL 'fort_test', handle 6f800000 at 0x25e174ec2e8> 
    <_FuncPtr object at 0x0000025E17617388> 
    <_FuncPtr object at 0x0000025E17617388> 
    c_long(3) 
    390943376  <---int value (my annotation for clarity) 
    <class 'int'> 
    c_long(390943376) 
    <__main__.LP_c_long object at 0x0000025E174D54C8> 

C:\Users\NAME\Desktop>python.exe py_wrapper.py 
    <CDLL 'fort_test', handle 6f800000 at 0x23fa636c2e8> 
    <_FuncPtr object at 0x0000023FA6497388> 
    <_FuncPtr object at 0x0000023FA6497388> 
    c_long(3) 
    -1506454896  <---int value (my annotation for clarity) 
    <class 'int'> 
    c_long(-1506454896) 
    <__main__.LP_c_long object at 0x0000023FA63554C8> 

這裏是我的Fortran代碼內容:

subroutine ex(i) 
    integer i 
    i=i+1 
    return i 
    end  

,這裏是我的Python包裝:(還有很多的測試東西在這裏)

from ctypes import * 

    DLL = CDLL('fort_test') 
    print(DLL) 

    print(getattr(DLL, 'ex_')) 
    print(DLL.ex_) 

    x = pointer(c_int(3)) 
    print(x.contents) 
    res = DLL.ex_(x) 
    print(res) 
    print(type(res)) 
    proc_res = pointer(c_int(res)) 
    print(proc_res.contents) 
    print(proc_res) 

我的問題是,有誰知道爲什麼這個輸出不斷變化?我的代碼輸入是3,我希望給出的函數有4個輸出,但是我得到的內容類似於內存地址(請參閱輸出示例中的註釋)或內存地址的有符號整數表示形式?

+0

儘管這裏沒有關係,我在Fortran子程序中可能並不意味着你的想法。 – francescalus

+0

哦,我忘了拿出來哈哈。我正在擺弄東西,我並不真正瞭解fortran那麼好(因此我爲什麼要試圖包裝它,我真的想要做這件事的代碼要大得多,我不能在這裏發佈) – Andy

+0

I對Fortan調用約定不熟悉,但是你*傳遞一個指向一個整數的指針而不是實際的整數。我的猜測是你正在收到的地址,而不是價值。你有沒有試過一個簡單的'res = DLL.ex_(3)'? –

回答

0

更新:

我解決了我的問題。

from ctypes import * 

DLL = windll.fort_test 
print DLL 

x = byref(c_int(3)) 
print x res = DLL.ex_(x) 
print cast(res,POINTER(c_int)).contents 

我也清理了很多。 我仍然通過引用傳遞,然後將返回的內存地址作爲c_int指針(全部大寫非常重要)並使用'.contents'函數指針對其進行解除引用。

+0

查看'argtypes'和'restype'使調用更容易。 –