繁体   English   中英

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

[英]Python subprocess not executing program correctly

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

也许它是由shell=True调用的 shell 引起的,如果这不会在您的系统上调用bash 您可以避免依赖扩展的 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()

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM