À l'aide de Python pour exécuter le fichier exécutable et de le remplir dans la saisie de l'utilisateur
Je suis en train d'utiliser Python pour automatiser un processus qui implique l'appel d'une Fortran exécutable et de présenter des entrées de l'utilisateur. J'ai passé quelques heures à lire grâce à des questions et d'essayer des choses différentes, mais je n'ai pas eu de chance. Voici un exemple minimal de montrer ce que j'ai essayé hier
#!/usr/bin/python
import subprocess
# Calling executable
ps = subprocess.Popen('fortranExecutable',shell=True,stdin=subprocess.PIPE)
ps.communicate('argument 1')
ps.communicate('argument 2')
Cependant, lorsque j'essaie d'exécuter ceci, j'obtiens l'erreur suivante:
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
Des suggestions ou des pointeurs sont grandement appréciés.
EDIT:
Lorsque j'appelle le Fortran exécutable, il demande la saisie de l'utilisateur comme suit:
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'
D'une certaine manière, j'ai besoin de lancer l'exécutable, attendre jusqu'à ce qu'il demande pour l'entrée d'utilisateur et d'alimentation d'entrée.
OriginalL'auteur James | 2014-02-03
Vous devez vous connecter pour publier un commentaire.
Si l'entrée ne dépend pas de la réponse à la question précédente, alors vous pourriez passer tout à la fois à l'aide de
.communicate()
:.communicate()
attend la fin du processus, par conséquent, vous pouvez l'appeler au plus une fois.il dit comme cela pour moi
TypeError: a bytes-like object is required, not 'str'
le code est en Python 2 (où
str
estbytes
type). Passertext=True
ouencoding
paramètre à Popen() sur l'actuelle version de Python.pouvez-vous m'aider avec le code?
par exemple,
subprocess.run('fortranExecutable', input="\n".join(["input 1", "input 2"]), text=True)
(testé sur Python 3.7)OriginalL'auteur jfs
Comme le spécification dit
communicate()
attend pour le sous-processus de résilier, de sorte que le deuxième appel sera adressé à la fin du processus.Si vous souhaitez interagir avec le processus, utilisez
p.stdin
&Co à la place (l'esprit de l'impasse d'avertissement).OriginalL'auteur bereal
Par le temps, vous arrivez à ps.communiquer (argument 2'), ps processus est déjà fermé, comme le ps.communiquer (l'argument de 1') attend jusqu'à ce que les expressions du FOLKLORE.
Je pense que, si vous voulez écrire plusieurs fois à stdin, vous pourriez avoir à utiliser:
OriginalL'auteur venpa
vos arguments ne doivent pas être transmis à communiquer. ils doivent être donnés dans l'appel à Popen, comme:
http://docs.python.org/2/library/subprocess.html#subprocess.Popen
OriginalL'auteur Colin Bernet