Python子进程没有正确执行程序

标签 python subprocess

我正在尝试在 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)。

最佳答案

您可以尝试 "\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"

关于Python子进程没有正确执行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15691771/

相关文章:

python - 解码 RFC 2231 header

python - "subprocess.Popen().readline()"在多线程python中无法返回

python - 如何在 Kivy 中通过 ids 正确链接按钮?

python - python中的递归搜索

python - 如何在json中转储压缩字符串?

python - Shell 命令仅在手动执行时有效,但不能从 Python 文件执行

ruby - 如何在 ruby​​ 中使用反引号开始子进程的连续输出

python - 为什么输出显示内存代码?

python - 为什么与多个 Popen 子进程一起使用时会发生通信死锁?

python - 未知算法类型 : word2vec