Verwendung von Python zum ausführen von ausführbaren und füllen Sie Benutzereingaben
Ich versuche, Python zu automatisieren einen Prozess, der Aufruf eines Fortran-ausführbare Datei und der Abgabe einiger Eingaben des Benutzers. Ich verbrachte ein paar Stunden Lesen, die ähnliche Fragen und versuchen, verschiedene Dinge, aber hatte noch nicht viel Glück. Hier ist ein minimal-Beispiel, um zu zeigen, was ich versucht habe Letzte
#!/usr/bin/python
import subprocess
# Calling executable
ps = subprocess.Popen('fortranExecutable',shell=True,stdin=subprocess.PIPE)
ps.communicate('argument 1')
ps.communicate('argument 2')
Jedoch, wenn ich versuche zu laufen, bekomme ich die folgende Fehlermeldung:
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
Anregungen oder Hinweise sind wir sehr dankbar.
EDIT:
Mir beim Aufruf der Fortran ausführbare Datei, fragt er nach Benutzer-Eingabe wie folgt:
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'
Irgendwie muss ich die ausführbare Datei ausführen, warten, bis er fragt nach Benutzer-Eingabe, und geben Sie dann die Eingaben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Eingabe hängt nicht von den vorherigen Antworten dann passieren könnte, Sie alle auf einmal mit
.communicate()
:.communicate()
wartet auf Prozess beenden, deshalb nennen Sie es höchstens einmal.TypeError: a bytes-like object is required, not 'str'
str
istbytes
- Typ). Passtext=True
oderencoding
parameter zu Popen() auf die aktuelle Python-version.subprocess.run('fortranExecutable', input="\n".join(["input 1", "input 2"]), text=True)
(getestet auf Python 3.7)Als spec sagt
communicate()
erwartet für den Unterprozess zu beenden, so wird der zweite Aufruf richtet sich an das beendete Verfahren.Wenn Sie interagieren wollen mit dem Prozess, verwenden
p.stdin
&Co statt (achten Sie auf die deadlock-Warnung).Durch die Zeit, die Sie erreichen ps.kommunizieren('argument 2'), ps Prozess ist bereits geschlossen, als ps.kommunizieren('argument 1') wartet, bis ein EOF-Zeichen.
Ich denke, wenn Sie schreiben wollen, mehrere Male auf stdin, haben Sie vielleicht zu verwenden:
Ihre Argumente sollten nicht weitergegeben werden, zu kommunizieren. Sie sollte gegeben werden, im Aufruf von Popen, wie:
http://docs.python.org/2/library/subprocess.html#subprocess.Popen