gfortran编译代码和g77编译代码在控制台中写入/读取时的差异
这个需要解释一下。请容忍我 我所拥有的 我拥有一些Fortran源代码和一些用这些代码编译的二进制文件。我没有进行编译,但有一个构建脚本表明G77是用来进行编译的 除了Fortran之类的东西外,还有一些Java代码为用户提供了一个围绕二进制文件的GUI“包装器”。它通过输入/输出/错误管道在自身和二进制文件之间传递信息。Java代码非常凌乱,这种方式增加了大量的样板文件和冗余,但它确实起到了作用,我知道它是有效的 我需要什么 不幸的是,我想做一些更改:gfortran编译代码和g77编译代码在控制台中写入/读取时的差异,fortran,stdout,stdin,gfortran,g77,Fortran,Stdout,Stdin,Gfortran,G77,这个需要解释一下。请容忍我 我所拥有的 我拥有一些Fortran源代码和一些用这些代码编译的二进制文件。我没有进行编译,但有一个构建脚本表明G77是用来进行编译的 除了Fortran之类的东西外,还有一些Java代码为用户提供了一个围绕二进制文件的GUI“包装器”。它通过输入/输出/错误管道在自身和二进制文件之间传递信息。Java代码非常凌乱,这种方式增加了大量的样板文件和冗余,但它确实起到了作用,我知道它是有效的 我需要什么 不幸的是,我想做一些更改: 我想为二进制文件创建一个新的Python
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
命令,但是代码甚至没有得到执行该部分的更改,所以我现在还不担心它
额外信息
- 我必须使用
标记调用gfortran,以便代码能够编译,但除此之外,我不使用任何其他方法。我曾尝试使用-ffix-line-length-132
标志,模糊地希望它会有所不同。没有-ff2c
- 这是有用的,但没有给我任何有用的东西
- 这表明printA应该可以正常工作
- 我正在Windows上工作,但需要多平台
- Juse在您被测试的情况下,Java代码使用
调用二进制文件,然后使用生成的Runtime.getRuntime().exec(“prog.exe”)
对象的各种“流”方法与它们通信。Python代码使用由进程
模块的子流程
对象提供的等价物Popen
- 我还应该说,我知道还有其他选择。用Python(或其他类似C++的语言)重写代码,或者进行修改,以便可以通过F2Py调用,这些都被排除在选项之外。使用77国集团也是不可能的;我们有足够的依赖性。我希望能够使用gfortran正确地在控制台上进行写/读操作,或者知道这是不可能的
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”,我可以让代码运行一段时间。但很快它就崩溃了。好的,“刷新”是这里的关键。