Skip to content Skip to sidebar Skip to footer

Using Python To Run Executable And Fill In User Input

I'm trying to use Python to automate a process that involves calling a Fortran executable and submitting some user inputs. I've spent a few hours reading through similar questions

Solution 1:

If the input doesn't depend on the previous answers then you could pass them all at once using .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() waits for process to terminate therefore you may call it at most once.

Solution 2:

As the spec sayscommunicate() awaits for the subprocess to terminate, so the second call will be addressed to the finished process.

If you want to interact with the process, use p.stdin&Co instead (mind the deadlock warning).

Solution 3:

By the time, you reach ps.communicate('argument 2'), ps process is already closed as ps.communicate('argument 1') waits until EOF. I think, if you want to write multiple times at stdin, you might have to use:

ps.stdin.write('argument 1')
ps.stdin.write('argument 2')

Solution 4:

your arguments should not be passed to communicate. they should be given in the call to Popen, like: 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!

Post a Comment for "Using Python To Run Executable And Fill In User Input"