3

我需要一个脚本来遍历目录结构,从目录中的文件中提取数字,然后对这些数字执行计算。我使用 Python 作为脚本的主要语言,但想使用 Fortran 进行数值计算。(我更喜欢 Fortran,它是一个更好的数值工作工具)

我正在尝试使用 f2py,但我不断收到奇怪的错误。f2py 抱怨我的变量声明,试图将字符(*)更改为整数并附加!当我在变量声明之后立即有评论时,我的变量名上。

该子例程太长,无法在此处发布,但需要两个参数,一个输入文件名和输出文件名。它打开输入文件,读取数字,处理它们,然后写入输出文件。我打算用Python脚本在每个目录下编写数值文件,并在上面调用Fortran子程序。

我可以尝试发布一个具有相同问题的较小示例,但是 f2py 是否有任何常见的“陷阱”?我正在使用 gfortran v4.6.1、python v3.2.2 和 f2py v2。

编辑: 这是一个具有相同错误的小示例:

itimes-sf(包含要从 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

一个.txt:

1
2
3
4
5
6
7
8
9
10.2

b.txt 仅使用 gfortran 编译和运行 itests 和 itimes-s 后:

   1.0000000000000000     
   4.0000000000000000     
   9.0000000000000000     
   16.000000000000000     
   25.000000000000000     
   36.000000000000000     
   49.000000000000000     
   64.000000000000000     
   81.000000000000000     
   104.03999999999999     

但是,运行 f2pyf2py.py -c -m its itimes-s.f会产生许多错误。(因篇幅原因未发布,但如果有人想要我可以发布)

4

1 回答 1

1

I have never tried using f2py to wrap a full Fortran module. However, if you extract the itimes function from the module into its own file and then run the same f2py command, everything appears to work when I tried it locally (f2py v2, numpy 1.6.1, python 2.7.2, gfortran 4.1.2).

Also, note that you are not explicitly closing your input and output files, though this has no real bearing on f2py's working or not.

于 2011-12-16T23:31:56.493 回答