我正在尝试使用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'
不知何故,我需要运行可执行文件,等待它询问用户输入然后提供该输入。
答案 0 :(得分:5)
如果输入不依赖于之前的答案,那么您可以使用.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()
等待进程终止,因此您最多可以调用一次。
答案 1 :(得分:1)
答案 2 :(得分:0)
当你到达ps.communicate('参数2')时,ps进程已经关闭,因为ps.communicate('参数1')等待直到EOF。 我想,如果你想在stdin上多次写,你可能不得不使用:
ps.stdin.write('argument 1')
ps.stdin.write('argument 2')
答案 3 :(得分:-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!