2017-03-09 54 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'使调用更容易。 –