7

我正在尝试使用 Python 来自动化一个涉及调用 Fortran 可执行文件并提交一些用户输入的过程。我花了几个小时阅读类似的问题并尝试不同的事情,但没有任何运气。这是一个最小的例子来展示我最后尝试的内容

#!/usr/bin/python

import subprocess

# Calling executable 
ps = subprocess.Popen('fortranExecutable',shell=True,stdin=subprocess.PIPE)
ps.communicate('argument 1')
ps.communicate('argument 2')

但是,当我尝试运行它时,出现以下错误:

  File "gridGen.py", line 216, in <module>
    ps.communicate(outputName)
  File "/opt/apps/python/epd/7.2.2/lib/python2.7/subprocess.py", line 737, in communicate
    self.stdin.write(input)
ValueError: I/O operation on closed file

非常感谢任何建议或指示。

编辑:

当我调用 Fortran 可执行文件时,它要求用户输入如下:

fortranExecutable
Enter name of input file: 'this is where I want to put argument 1'
Enter name of output file: 'this is where I want to put argument 2'

不知何故,我需要运行可执行文件,等到它要求用户输入然后提供该输入。

4

4 回答 4

8

如果输入不依赖于先前的答案,那么您可以使用以下命令一次全部传递它们.communicate()

import os
from subprocess import Popen, PIPE

p = Popen('fortranExecutable', stdin=PIPE) #NOTE: no shell=True here
p.communicate(os.linesep.join(["input 1", "input 2"]))

.communicate()等待进程终止,因此您最多可以调用它一次。

于 2014-03-08T08:05:20.430 回答
1

正如规范所说, communicate()等待子进程终止,因此第二次调用将发送给已完成的进程。

如果您想与进程交互,请改用p.stdin&Co(注意死锁警告)。

于 2014-02-03T08:06:31.533 回答
0

当你到达 ps.communicate('argument 2') 时,ps 进程已经关闭,因为 ps.communicate('argument 1') 一直等到 EOF。我认为,如果您想在标准输入中多次写入,您可能必须使用:

ps.stdin.write('argument 1')
ps.stdin.write('argument 2')
于 2014-02-03T08:35:54.883 回答
-1

你的论点不应该传递给沟通。它们应该在对 Popen 的调用中给出,例如: http ://docs.python.org/2/library/subprocess.html#subprocess.Popen

>>> import shlex, subprocess
>>> command_line = raw_input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!
于 2014-02-03T08:06:59.880 回答