Встраивание Fortran в Python с помощью f2py

Мне нужен сценарий для рекурсии по структуре каталогов, извлечения чисел из файлов в каталогах, а затем выполнения вычислений с этими числами. Я использую Python в качестве основного языка для скрипта, но хотел использовать Fortran для численных вычислений. (Мне удобнее работать с Фортраном, и это лучший инструмент для числовой работы)

Я пытаюсь использовать f2py, но все время получаю странные ошибки. f2py жалуется на мои объявления переменных, пытается изменить символ (*) на целое число и добавить! на имена моих переменных, когда у меня есть комментарий сразу после объявления переменной.

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

Я могу попытаться опубликовать небольшой пример с теми же проблемами, но есть ли общие ошибки с f2py? Я использую gfortran v4.6.1, python v3.2.2 и f2py v2.

РЕДАКТИРОВАТЬ: Вот небольшой пример с теми же ошибками:

itimes-s.f (файл, содержащий подпрограмму для использования из python):

  module its

  contains

  subroutine itimes(infile,outfile)

    implicit none

    ! Constants
    integer, parameter :: dp = selected_real_kind(15)

    ! Subroutine Inputs
    character(*), intent(in) :: infile    ! input file name
    character(*), intent(in) :: outfile   ! output file name

    ! Internal variables
    real(dp) :: num               ! number to read from file
    integer :: inu                ! input unit number
    integer :: outu               ! output unit number
    integer :: ios                ! IOSTAT for file read

    inu = 11
    outu = 22

    open(inu,file=infile,action='read')
    open(outu,file=outfile,action='write',access='append')

    do
      read(inu,*,IOSTAT=ios) num
      if (ios < 0) exit

      write(outu,*) num**2
    end do

  end subroutine itimes

  end module its

itests.f (программа драйвера Fortran):

  program itests

  use its

  character(5) :: outfile
  character(5) :: infile

  outfile = 'b.txt'
  infile = 'a.txt'

  call itimes(infile, outfile)

  end program itests

a.txt:

1
2
3
4
5
6
7
8
9
10.2

b.txt после компиляции и запуска itests и itimes-s с использованием только gfortran:

   1.0000000000000000     
   4.0000000000000000     
   9.0000000000000000     
   16.000000000000000     
   25.000000000000000     
   36.000000000000000     
   49.000000000000000     
   64.000000000000000     
   81.000000000000000     
   104.03999999999999     

Однако запуск f2py с использованием f2py.py -c -m its itimes-s.f вызывает множество ошибок. (не опубликовано из-за длины, но если кто-то захочет, я могу опубликовать их)


person astay13    schedule 15.12.2011    source источник
comment
Пожалуйста, опубликуйте пример. После этого будет намного проще дать совет.   -  person Rook    schedule 16.12.2011
comment
вы можете сократить свою подпрограмму до минимума, который имеет ту же проблему, а затем опубликовать ее здесь.   -  person steabert    schedule 16.12.2011
comment
@steabert и Idigas, извините за задержку, посмотрите пример выше.   -  person astay13    schedule 16.12.2011


Ответы (1)


Я никогда не пробовал использовать f2py для обертывания полного модуля Fortran. Однако, если вы извлечете функцию itimes из модуля в его собственный файл, а затем запустите ту же команду f2py, все будет работать, когда я попробовал ее локально (f2py v2, numpy 1.6.1, python 2.7.2, gfortran 4.1.2 ).

Также обратите внимание, что вы явно не закрываете свои входные и выходные файлы, хотя это не имеет реального отношения к работе f2py или нет.

person Tim Whitcomb    schedule 16.12.2011
comment
Потому что имя модуля python должно отличаться от модуля Fortran. Тогда у вас будет pythonmodule.fortranmodule.yourfunction - person Vladimir F; 20.12.2011