Встраивание Фортрана в Python с помощью f2py - PullRequest
2 голосов
/ 16 декабря 2011

Мне нужен скрипт для рекурсии по структуре каталогов, извлечения чисел из файлов в каталогах, а затем выполнения вычислений по этим числам Я использую 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 после компиляции и запуска ites и itimes с использованием только 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 приводит к многочисленным ошибкам. (не опубликовано из-за длинны, но если кто-то захочет, я могу опубликовать их)

1 Ответ

1 голос
/ 17 декабря 2011

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

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

...