Как включить в f2py только некоторые модули через setup.py

У меня есть очень длинный фрагмент кода на Фортране, некоторые части которого я хотел бы открыть для Python. Он отлично работает из командной строки, с

f2py -m extrpsf -c extract_psf.f95 only: extract_psf psfmany :

Я надеюсь распространять это, поэтому я пытаюсь заставить его работать с numpy.distutils.core. Я думал, что следующее должно работать:

from numpy.distutils.core import setup, Extension
setup(name="extrpsf",
ext_modules=[Extension(name='extrpsf', sources=['extract_psf.f95'],
                       f2py_options=['only: extract_psf psfmany :'])])

К сожалению, это не работает. Какие-либо предложения?

Приносим извинения за то, что не предоставили подробностей о сообщении об ошибке ранее. Теперь я сделал то, что должен был сделать раньше, и упростил задачу. Итак, предположим, что у меня есть следующий код фортрана: подпрограмма add_test.f95 точность, намерение(out) :: out(n2) integer :: i2 do i2 = 1,n2 out(i2) = sum(in(:,i2)) enddo return end подпрограмма add_axis2

subroutine add_axis1(in, n1, n2, out)
  integer, intent(in) :: n1, n2
  double precision, intent(in) :: in(n1, n2)
  double precision, intent(out) :: out(n1)
  integer :: i1
  do i1 = 1,n1
     out(i1) = sum(in(i1,:))
  enddo
  return
end subroutine add_axis1

Тогда, если я побегу

f2py -m add_test -c add_test.f95 only: add_axis1 :

Я получаю add_test.so, который, если я его импортирую, будет иметь только add_axis1. Однако, если я сделаю setup.py с

from numpy.distutils.core import setup, Extension
setup(name="add_test",
      ext_modules=[Extension(name='add_test', sources=['add_test.f95'],
                             f2py_options=['only: add_axis2 :'])])

и беги

python setup.py build

полученный add_test.so по-прежнему содержит обе подпрограммы. (Это также объясняет сообщение об ошибке, которое я получаю ранее; в моем более длинном коде есть части, которые забивает f2py, которые при ручном вызове f2py просто пропускаются). Итак, я думаю, мой вопрос упростился до того, как я гарантирую в setup.py, что выполняются только некоторые подпрограммы.

Посмотрев более подробно на вывод, я вижу, что

running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands --compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
running build_src
build_src
building extension "add_test" sources
f2py options: ['only: add_axis2 :']
f2py:> build/src.linux-x86_64-2.7/add_testmodule.c
creating build
creating build/src.linux-x86_64-2.7
IOError: [Errno 2] No such file or directory: 'only: add_axis2 :'. Skipping file "only: add_axis2 :".

так что ошибка становится яснее. ... и действительно, при этом еще некоторое гугление дает ответ; с http://cens.ioc.ee/pipermail/f2py-users/2005-July/001125.html если я вместо этого

from numpy.distutils.core import setup, Extension
setup(name="add_test",
      ext_modules=[Extension(name='add_test', sources=['add_test.f95'],
                             f2py_options=['only:']+['add_axis2']+[':'])])

простой пример работает, и с аналогичным изменением работает и более сложный...


person user2483412    schedule 13.06.2013    source источник
comment
Почему это не сработало? В чем ошибка?   -  person astrojuanlu    schedule 02.07.2013
comment
Под влиянием вашего вопроса я сделал то, что должен был сделать в первую очередь: сделал более простой пример. Как показано в отредактированном примере, это позволило мне устранить неполадки и найти ответ. Тем не менее спасибо!   -  person user2483412    schedule 06.07.2013


Ответы (1)


Отлично, решение с использованием f2py_options работает!

Extension(
    name='module.routine_ext',
    sources=['src/source_file.f'],
    f2py_options=['only:', 'subroutine_name', ':'],
    language='f77')
person n1nj4    schedule 21.11.2018