gfortran编译代码和g77编译代码在控制台中写入/读取时的差异

gfortran编译代码和g77编译代码在控制台中写入/读取时的差异,fortran,stdout,stdin,gfortran,g77,Fortran,Stdout,Stdin,Gfortran,G77,这个需要解释一下。请容忍我 我所拥有的 我拥有一些Fortran源代码和一些用这些代码编译的二进制文件。我没有进行编译,但有一个构建脚本表明G77是用来进行编译的 除了Fortran之类的东西外,还有一些Java代码为用户提供了一个围绕二进制文件的GUI“包装器”。它通过输入/输出/错误管道在自身和二进制文件之间传递信息。Java代码非常凌乱,这种方式增加了大量的样板文件和冗余,但它确实起到了作用,我知道它是有效的 我需要什么 不幸的是,我想做一些更改: 我想为二进制文件创建一个新的Python

这个需要解释一下。请容忍我

我所拥有的 我拥有一些Fortran源代码和一些用这些代码编译的二进制文件。我没有进行编译,但有一个构建脚本表明G77是用来进行编译的

除了Fortran之类的东西外,还有一些Java代码为用户提供了一个围绕二进制文件的GUI“包装器”。它通过输入/输出/错误管道在自身和二进制文件之间传递信息。Java代码非常凌乱,这种方式增加了大量的样板文件和冗余,但它确实起到了作用,我知道它是有效的

我需要什么 不幸的是,我想做一些更改:

  • 我想为二进制文件创建一个新的Python包装器(或者更准确地说,扩展一个现有的Python程序以成为新的包装器)

  • 我希望能够编译Fortran代码,作为现有程序构建过程的一部分。我想使用gfortran来实现这一点,因为MinGW在构建中的其他地方使用,因此它将随时可用

  • 问题 当我自己使用gfortran编译Fortran代码时,我无法让生成的二进制文件与当前的Java包装器或新的Python包装器“对话”

    以下是我在Fortran代码中尝试过的打印到控制台的各种方法:

    subroutine printA(message)
      write(6,*) message
    end
    
    subroutine printB(message)
      write(*,*) message
    end
    
    subroutine printC(message)
      use iso_fortran_env
      write(output_unit,*) message
    end
    
    还有
    read
    命令,但是代码甚至没有得到执行该部分的更改,所以我现在还不担心它

    额外信息
    • 我必须使用
      -ffix-line-length-132
      标记调用gfortran,以便代码能够编译,但除此之外,我不使用任何其他方法。我曾尝试使用
      -ff2c
      标志,模糊地希望它会有所不同。没有

    • 这是有用的,但没有给我任何有用的东西

    • 这表明printA应该可以正常工作

    • 我正在Windows上工作,但需要多平台

    • Juse在您被测试的情况下,Java代码使用
      Runtime.getRuntime().exec(“prog.exe”)
      调用二进制文件,然后使用生成的
      进程
      对象的各种“流”方法与它们通信。Python代码使用由
      子流程
      模块的
      Popen
      对象提供的等价物

    • 我还应该说,我知道还有其他选择。用Python(或其他类似C++的语言)重写代码,或者进行修改,以便可以通过F2Py调用,这些都被排除在选项之外。使用77国集团也是不可能的;我们有足够的依赖性。我希望能够使用gfortran正确地在控制台上进行写/读操作,或者知道这是不可能的


    很难说不从Fortran和Python代码中看到更多细节。以下代码对我很有用(至少在Linux下):

    Fortran程序以行号为前缀逐行重复其输入:

    program test_communication
      use iso_fortran_env, stdout => output_unit, stdin => input_unit
      implicit none
    
      character(100) :: buffer
      integer :: ii
    
      ii = 1
      do while (.true.)
        read(stdin, *) buffer
        write(stdout, "(I0,A,A)") ii, "|", trim(buffer)
        flush(stdout)
        ii = ii + 1
      end do
    
    end program test_communication
    
    调用Fortran二进制文件的Python程序。您可以从控制台向其提供任意字符串

    import subprocess as sub
    
    print "Starting child"
    proc = sub.Popen("./a.out", stdin=sub.PIPE, stdout=sub.PIPE)
    while True:
        send = raw_input("Enter a string: ")
        if not send:
            print "Exiting loop"
            break
        proc.stdin.write(send)
        proc.stdin.write("\n")
        proc.stdin.flush()
        print "Sent:", send
        recv = proc.stdout.readline()
        print "Received:", recv.rstrip()
    print "Killing child"
    proc.kill()
    

    首先,若消息是字符类型,那个么需要声明它。它的隐式整数原样。这对我有帮助,因为它在我编译它时起作用!我不确定到底有什么不同(也许是同花顺的说法),但现在已经足够了。非常感谢。有趣的是,通过将GFORTRAN\u UNBUFFERED\u ALL环境变量设置为“y”,我可以让代码运行一段时间。但很快它就崩溃了。好的,“刷新”是这里的关键。