2017-04-22 4 views
0

Ma question: J'ai besoin de sauvegarder la sortie d'un solveur SPARC (qui apparaît actuellement sous forme de texte dans le terminal) comme variable dans mon code Python. Comment puis-je faire ceci?Comment utiliser la sortie du solveur SPARC comme entrée d'un fichier python?

Remarque: SPARC est un solveur utilisé pour les fichiers ASP (answer-set-programming). Il suffit de le mentionner pour que les gens ne s'y perdent pas et pensent que je fais référence à asp.net.

Je cours un fichier Python et un fichier ASP (en mode requête) simultanément, dans le même terminal, en utilisant la commande python pythonfile.py | java -jar sparc.jar aspfile.sp. La sortie du fichier python sous la forme sys.stdout.write() est en cours de redirection en tant qu'entrée du solveur SPARC; c'est-à-dire que le texte que je publie devient la requête qui est résolue en utilisant mon code ASP. Cela fonctionne, et génère la sortie que je veux, mais je ne peux pas comprendre comment utiliser cette sortie dans mon code Python.

Ceci est une suite à une autre question que j'ai posée, trouvée here. Dans cette question, j'essayais de savoir comment exécuter un fichier ASP à partir de mon code C++. Je suis allé avec l'option 2 dans la réponse qui m'a été donnée, et j'utilise stdout redirigé avec les deux fichiers en cours d'exécution en tant que processus distincts. Veuillez noter un changement majeur depuis la question originale: J'utilise maintenant Python au lieu de C++.

Autres détails si nécessaire: Ma version Python est 2.7 et mon système d'exploitation est Ubuntu 14.04. Je ne pense pas que ce soit pertinent mais, dans ce cas, vous devriez savoir que mon code Python est également utilisé pour contrôler une simulation de Gazebo Turtlebot, et j'utilise ROS Indigo pour exécuter cette simulation. Je ne publierai pas mon code à moins que quelqu'un ne le demande, car je veux juste avoir une idée de la méthode que je pourrais utiliser (je ne trouve rien qui fonctionne sur Internet), plutôt que d'avoir besoin de mon code débogué. Cependant, je vais poster ci-dessous un exemple de ce qui est sorti sur le terminal lorsque mon code fonctionne, car c'est l'information que j'essaie de «capturer».

SPARC V2.52 
program translated 
?- yes 
?- no 

Ce sont les réponses 'oui' et 'non' que je veux sauvegarder en tant que variables dans mon fichier Python.

SOLUTION:
Pour quiconque voulant faire la même chose, j'ai suivi la réponse fournie par CaptainTrunky.
D'abord, je lance la commande python pythonfile.py | java -jar sparc.jar aspfile.sp > sparc.out, en enregistrant la sortie SPARC dans le fichier texte sparc.out.
Ensuite, je cours python outputParser.py pour exécuter un script qui imprime le contenu du fichier texte, ce qui me permet de vérifier que je manipule correctement les données. Le script est très simple:

lines = [line.strip('?- ') for line in open('sparc.out')] 
lines = [line.strip('\n') for line in lines] 
print lines 
+0

Juste comme une note: Si vous pouvez survivre avec un solveur ASP-Core-2 classique, clingo (que SPARC semble utiliser sous le capot) a des interfaces python, C & C++ IIRC. Pour ROS, que je connais très peu personnellement, il y a http: //www.cs.uni-potsdam.de/rosoclingo/ – vukk

Répondre

1

Vous pouvez utiliser python pour lire sys.stdin avec un script semblable au suivant (filter.py):

import sys 
for line in sys.stdin.readlines(): 
    if line.startswith('?- '): 
    print line.strip() 

ensuite appeler votre pipeline comme ceci:

python pythonfile.py | java -jar sparc.jar aspfile.sp | python filter.py 
0

Je vous suggère de faire vider la sortie SPARK vers un fichier texte, puis pour analyser avec vous outil.

Ecrire un script shell qui le fait pour vous:

python pythonfile.py | java -jar sparc.jar aspfile.sp > spark.out 
python parse_out.py spark.out