使用内部可分配数组和f2py

时间:2016-02-21 08:13:44

标签: python fortran f2py

我正在使用f2py来包装一些Fortran子例程。从Python调用时,我总是使用显式数组作为输入/输出,但是有一些需要可分配的工作数组。这些数组与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

每当我使用内部可分配数组时,我在执行" python setup.py develop"时会得到以下输出。与NumPy的distutils包:

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和gfortran 5.2.0,mingw64,Windows 10中的NumPy配置类。

如果我直接使用gfortran,程序将编译得很好,但当它与f2py(或该进程中的某个地方)连接时,事情就会失败。我可以注释掉分配行,它会编译,但显然不能在运行时工作。无论我有多少可分配的数组,总有3个未解析的外部。

虽然我在这里,但如果Fortran子例程中有写入或打印语句,我会收到类似的链接错误。我不需要它们,如果有人有想法,它只对调试有用。

感谢您的帮助。

更新1:

使用numpy.distutils.misc_util中的Configuration类我添加了一个额外的链接选项

config.add_extension('test_lib', sources, extra_link_args=['/FORCE']

查看信息here at Microsoft Linker Options后。 ' / FORCE'是关键选择。 print或write命令仍然在Python中抛出退出代码255,但至少可分配的数组似乎正在工作,这就是我所关心的。

看起来像是一个黑客,但如果有人知道是什么导致原始问题,我可能仍然有一个更深层次的根本问题,我需要解决。

1 个答案:

答案 0 :(得分:1)

我遇到链接问题,并在f2py选项中指定compiler = mingw32修复了所有问题。