2016-02-21 3 views
0

Я использую f2py для переноса некоторых подпрограмм Fortran. При вызове из Python я всегда использую явные массивы для ввода/вывода, но имею несколько рабочих массивов, которые должны быть выделены. Эти массивы не имеют интерфейса с Python. Небольшой тест подпрограмма, распространяющаяся проблема показано ниже:Использование внутренних распределяемых массивов с помощью f2py

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 

Всякий раз, когда я использую внутренние размещаемые массивы я получаю следующий вывод, делая «питон setup.py разработки» с Distutils пакетом Numpy в:

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 от numpy.distutils.misc_utl и gfortran 5.2.0, mingw64, Windows 10.

Программа будет скомпилировать просто отлично, если я использую gfortran напрямую, но когда он подключается к f2py (или где-то в этом процессе) t хайсы терпят неудачу. Я могу прокомментировать выделенную строку, и она будет компилироваться, но, очевидно, не работает во время выполнения. Всегда есть 3 нерешенных внешних, независимо от того, сколько распределяемых массивов у меня есть.

Пока я здесь, у меня возникают аналогичные ошибки ссылок, если в подпрограмме Fortran есть оператор записи или печати. Мне они не нужны, они просто будут полезны для отладки, если у кого-то есть идея.

Спасибо за помощь.

UPDATE 1:

Использование класса конфигурации с numpy.distutils.misc_util я добавил дополнительный пункт ссылку

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

посмотрев на информацию here at Microsoft Linker Options. Параметр «/ FORCE» является ключевым. Команда print или write все еще отбрасывает код выхода 255 в Python, но по крайней мере распределяемые массивы, похоже, работают, и это все, о чем я заботился.

Кажется, что это взломать, но если кто-то знает, что вызывает исходную проблему, у меня, вероятно, все еще есть более глубокая проблема, которую мне нужно решить.

+0

Дикое предположение: в вашем примере проблема сохраняется, если вы явно «освобождаете (z)» перед выходом из подпрограммы? –

+0

@ ev-br Это не имеет значения. –

+0

Как-то вы не связываете библиотеку времени исполнения gfortran. Что происходит, когда у вас нет распределяемых арабов, но заявление печати или что-то подобное в коде? Попробуйте сделать простую dll с простым 'f2py -c -m module_name'. –

ответ

1

У меня была проблема с ссылкой и указание компилятора = mingw32 в параметрах f2py исправили все проблемы.

 Смежные вопросы

  • Нет связанных вопросов^_^