2017-10-13 6 views
0

Je suis complètement nouveau à python mais j'essaie d'apprendre. Je voudrais utiliser la commande de sous-processus pour exécuter un programme de simulation que je peux appeler dans le terminal dans un environnement bash. La syntaxe est assez simple: commande inputfile.in où dans la commande est un plus grand script de simulation dans un environnement tcltk.sous-processus manquant fichier de sortie

Ok J'ai lu beaucoup de documentation sur Python et j'ai décidé d'utiliser la fonctionnalité Popen de la commande subprocess.

D'après ce que je comprends que je devrais être capable de formater la commande comme suit:

p= subprocess.Popen(['command','inputfile.in'],stdout= subprocess.PIPE]) 
    print(p.communicate()) 

La sortie de cette commande sont deux fichiers. Lorsque j'exécute la commande dans le terminal, j'obtiens deux fichiers dans le même répertoire que le fichier d'entrée d'origine. Quand j'utilise Popen, il y a deux choses qui me déroutent. (1) Je n'obtiens aucun fichier de sortie écrit dans le répertoire du fichier d'entrée. (2) La valeur p.communicate est présente indiquant que la simulation a été exécutée. Qu'arrive-t-il aux fichiers de sortie?

Existe-t-il un moyen spécifié d'appeler une fonction de commande qui produit des fichiers en conséquence?

Je cours ceci dans une cellule de Jupyter-cahier à l'intérieur de la boucle for. Cette boucle for permet de modifier de façon itérative le fichier d'entrée et donc de faire varier systématiquement les conditions des simulations. Mes systèmes d'exploitation sont mac osx.

Le but est de simuler ou d'exécuter la commande à chaque itération de la boucle for puis de stocker les données du fichier de sortie dans un dictionnaire plus grand. Plus tard, je voudrais comparer les données du fichier de sortie aux données expérimentales itérativement dans un processus d'optimisation qui minimise les résidus.

J'apprécierais toute aide. Aussi n'importe quelle direction si popen n'est pas la fonction python correcte pour le faire.

+0

Réessayez avec 'p = subprocess.Popen ([ 'commande', 'inputfile.in'], stderr = subprocess.PIPE, stdout = sous-processus. PIPE, stdout = sous-processus.PIPE) '. – swatchai

+0

qui génère une erreur du sous-processus, Fichier "", ligne 2 p = sous-processus.Popen (['/ usr/local/bin/simpson', nomfichier], stdout = sous-processus. PIPE, stdout = subprocess.PIPE) SyntaxError: mot-clé argument répété – witheve

+0

Désolé pour mon erreur. J'ai 'stdout = subprocess.PIPE' deux fois. – swatchai

Répondre

0

Apprenons de quelque chose de facile comme ceci:

# This is equivalent with the command line `dir *.* /s /b` on Windows 
import subprocess 
sp = subprocess.Popen(['dir', '*.*', '/s', '/b'], stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 
(std_out, std_err) = sp.communicate() # returns (stdout, stderr) 

# print out if error occur 
print('std_err: ', std_err) # expect ('std_err: ', '') 
# print out saved echoing messages 
print('std_out: ', std_out) # expect ('std_out: ', ... can be a long list ...) 
+0

cela a aidé à déboguer le processus. bien que p communiquait que la simulation fonctionnait il y avait. erreur finale qui a à voir avec le formatage d'un processus final dans le fichier d'entrée. – witheve