3

我正在尝试在 Python 的 shell 中执行 Fortran 程序。我subprocess用来调用 Fortran 程序并传递参数(需要两个输入文件)。我就是这样做的:

COMMAND = '/path/to/FORTRAN/program << !\n' + INPUT_FILE1 + '\n' + INPUT_FILE2 +'\n!'
return = subprocess.call(COMMAND, shell=True)

不幸的是,Fortran 程序退出时:

? FORTRAN Runtime Error:
? Attempt to read past end of file
? READ(UNIT=22,...

不是输入文件或 Fortran 程序的问题。当我在我的 shell 中执行此操作时:

$>/path/to/FORTRAN/program << !
>INPUT_FILE1
>INPUT_FILE2
>!

一切都按预期工作(否Attempt to read past end of file)。

我无权访问 Fortran 源,所以我无法检查那里发生了什么。我认为这与我调用程序的方式有关subprocess——我只是不知道是什么。

我正在使用 Python 2.6.6。

快速解释:Fortran 程序将提示输入两个输入文件,但它不会将它们识别为命令行选项(不能在调用程序时提供它们)。如果你想运行它——比如说一个 shell 脚本(批处理模式)——你需要捕获返回命令来执行命令,还要提供这两个文件。<< !由于缺少更好的术语,因此打开了一个“列表”。以下命令被传递给程序,该程序等待执行,直到!输入。

我已经多次成功地使用了这种方法(不同的 Fortran 代码),并且在这个方法中,使用了C shell脚本(不是 Python)。

4

3 回答 3

1

shell=True如果它没有bash在您的系统上调用,可能是由调用的 shell 引起的。您可以避免依赖扩展的 shell 语法<<,而是自己构建整个调用,如下所示:

popen = subprocess.Popen(["/path/to/FORTRAN/program"], stdin=subprocess.PIPE)
popen.stdin.write('123\n')
time.sleep(0.1)    # hack, following LAK's suggestion
popen.stdin.write('456\n')
popen.stdin.close()
result = popen.wait()
于 2013-03-28T21:54:36.107 回答
1

不久前我遇到了类似的问题,结果证明是添加了一个小暂停。看看这个,看看这个技术是否有帮助。

于 2013-03-29T20:18:19.020 回答
1

您可以尝试"\r\n"(tty 换行符):

from subprocess import Popen, PIPE

p = Popen(["/path/to/FORTRAN/program"], stdin=PIPE,
          bufsize=1, close_fds=True)
p.communicate("INPUT_FILE1\r\nINPUT_FILE2")
rc = p.returncode

最后有/没有"\r\n"

于 2013-05-16T15:31:39.597 回答