我已经适应从这个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个输出,但是我得到的内容类似于内存地址(请参阅输出示例中的注释)或内存地址的有符号整数表示形式?
尽管这里没有关系,我在Fortran子程序中可能并不意味着你的想法。 – francescalus
哦,我忘了拿出来哈哈。我正在摆弄东西,我并不真正了解fortran那么好(因此我为什么要试图包装它,我真的想要做这件事的代码要大得多,我不能在这里发布) – Andy
I对Fortan调用约定不熟悉,但是你*传递一个指向一个整数的指针而不是实际的整数。我的猜测是你正在收到的地址,而不是价值。你有没有试过一个简单的'res = DLL.ex_(3)'? –