Python包装器中的Fortran DLL,输出相同的功能各不相同

时间:2017-03-09 03:24:01

标签: python dll fortran ctypes

我已根据此question

调整了我的代码

我的最终目标是: - 在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,但是我得到的内存地址(参见输出示例中的注释)或内存地址的有符号整数表示?

1 个答案:

答案 0 :(得分:1)

更新:

我已经解决了我的问题。

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'函数指针取消引用它