在 f2py 中使用内部可分配数组
Using internal allocatable arrays with f2py
我正在使用 f2py 包装一些 Fortran 子例程。从 Python 调用时,我总是对 input/output 使用显式数组,但有一些工作数组需要分配。这些数组与 Python 没有接口。复制问题的小测试子程序如下所示:
subroutine test(n, x, y)
!f2py intent(in) n, x
!f2py intent(out) y
!f2py depend(n) x
integer, intent(in) :: n, x(n)
integer, intent(out) :: y
integer, allocatable :: z(:)
allocate(z(n))
z(:) = 10
y = z(2) + x(1)
end subroutine test
每当我使用内部可分配数组时,在使用 NumPy 的 distutils 包执行 "python setup.py develop" 时,我会得到以下输出:
test.o : error LNK2019: unresolved external symbol _gfortran_runtime_error referenced in function test_
test.o : error LNK2019: unresolved external symbol _gfortran_runtime_error_at referenced in function test_
test.o : error LNK2019: unresolved external symbol _gfortran_os_error referenced in function test_
ASAP\lib\asap_lib.pyd : fatal error LNK1120: 3 unresolved externals
我正在使用来自 numpy.distutils.misc_utl 的 NumPy 配置 class 和 gfortran 5.2.0、mingw64、Windows 10.
如果我直接使用 gfortran,该程序将编译得很好,但是当它与 f2py(或该过程中的某个地方)连接时,事情就会失败。我可以注释掉分配行,它会编译,但显然在运行时不起作用。无论我有多少个可分配数组,总是有 3 个未解析的外部变量。
当我在这里时,如果 Fortran 子例程中有写入或打印语句,我会遇到类似的 link 错误。我不需要它们,如果有人有想法,它们只会对调试有用。
感谢您的帮助。
更新 1:
使用 numpy.distutils.misc_util 中的配置 class 我添加了一个额外的 link 选项
config.add_extension('test_lib', sources, extra_link_args=['/FORCE']
查看信息后 here at Microsoft Linker Options。 '/FORCE' 是关键选项。打印或写入命令仍然在 Python 中返回退出代码 255,但至少可分配数组似乎在工作,这就是我所关心的。
看起来像是黑客攻击,但如果有人知道是什么导致了最初的问题,我可能还有更深层次的问题需要解决。
我有一个 link 问题,在 f2py 选项中指定 compiler=mingw32 解决了所有问题。
我正在使用 f2py 包装一些 Fortran 子例程。从 Python 调用时,我总是对 input/output 使用显式数组,但有一些工作数组需要分配。这些数组与 Python 没有接口。复制问题的小测试子程序如下所示:
subroutine test(n, x, y)
!f2py intent(in) n, x
!f2py intent(out) y
!f2py depend(n) x
integer, intent(in) :: n, x(n)
integer, intent(out) :: y
integer, allocatable :: z(:)
allocate(z(n))
z(:) = 10
y = z(2) + x(1)
end subroutine test
每当我使用内部可分配数组时,在使用 NumPy 的 distutils 包执行 "python setup.py develop" 时,我会得到以下输出:
test.o : error LNK2019: unresolved external symbol _gfortran_runtime_error referenced in function test_
test.o : error LNK2019: unresolved external symbol _gfortran_runtime_error_at referenced in function test_
test.o : error LNK2019: unresolved external symbol _gfortran_os_error referenced in function test_
ASAP\lib\asap_lib.pyd : fatal error LNK1120: 3 unresolved externals
我正在使用来自 numpy.distutils.misc_utl 的 NumPy 配置 class 和 gfortran 5.2.0、mingw64、Windows 10.
如果我直接使用 gfortran,该程序将编译得很好,但是当它与 f2py(或该过程中的某个地方)连接时,事情就会失败。我可以注释掉分配行,它会编译,但显然在运行时不起作用。无论我有多少个可分配数组,总是有 3 个未解析的外部变量。
当我在这里时,如果 Fortran 子例程中有写入或打印语句,我会遇到类似的 link 错误。我不需要它们,如果有人有想法,它们只会对调试有用。
感谢您的帮助。
更新 1:
使用 numpy.distutils.misc_util 中的配置 class 我添加了一个额外的 link 选项
config.add_extension('test_lib', sources, extra_link_args=['/FORCE']
查看信息后 here at Microsoft Linker Options。 '/FORCE' 是关键选项。打印或写入命令仍然在 Python 中返回退出代码 255,但至少可分配数组似乎在工作,这就是我所关心的。
看起来像是黑客攻击,但如果有人知道是什么导致了最初的问题,我可能还有更深层次的问题需要解决。
我有一个 link 问题,在 f2py 选项中指定 compiler=mingw32 解决了所有问题。