2017-04-22 63 views
0

我的问题:我需要将我的Python代码中的一个SPARC求解器的输出保存为一个变量(目前在终端中显示为文本)。我怎样才能做到这一点?如何使用SPARC求解器的输出作为python文件的输入?

快速注意:SPARC是一种用于ASP(应答集编程)文件的解算器 - 只是提到这一点,以免人们感到困惑,并认为我指的是asp.net。

我在同一个终端中使用命令python pythonfile.py | java -jar sparc.jar aspfile.sp同时运行一个Python文件和一个ASP文件(在查询模式下)。 python文件输出形式为sys.stdout.write()正被重定向为SPARC解算器的输入;即我输出的文本成为使用我的ASP代码解决的查询。这是工作,并生成我想要的输出,但我无法弄清楚如何在我的Python代码中使用该输出。

这是我询问的另一个问题的后续行动,找到了here。在那个问题中,我试图找出如何从我的C++代码运行一个ASP文件。我在给出的答案中使用了选项2,并且使用重定向的标准输出和两个作为单独进程运行的文件。请注意自原始问题以来的一个主要变化:我现在使用Python而不是C++。

更多细节如果需要:我的Python版本是2.7,我的操作系统是Ubuntu 14.04。我不认为它是相关的,但是,如果是这样,你应该知道我的Python代码也被用来控制Gazebo Turtlebot模拟,并且我正在使用ROS Indigo来运行该模拟。我不会发布我的代码,除非有人要求它,因为我只是想知道我可以使用什么方法(我无法找到任何可以在互联网上工作的方法),而不需要我的代码调试/协助编写它。不过,我会在我的代码运行时输出到终端的例子下面发布,因为这是我想要捕获的信息。

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

这是答案'是'和'否',我想保存为我的Python文件中的变量。

解决方案:
对于任何想要做同样事情的人,我都遵循了特伦斯基船长提供的答案。
首先我运行命令python pythonfile.py | java -jar sparc.jar aspfile.sp > sparc.out,将SPARC输出保存到文本文件sparc.out。
然后我运行python outputParser.py来运行脚本,该脚本打印文本文件的内容,允许我检查是否正确操作数据。脚本很简单:

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

正如一个注释:如果你能活下去使用常规的ASP-Core-2求解器,clingo(SPARC似乎在引擎盖下面使用)具有Python,C和C++接口IIRC。对于我个人了解甚少的ROS,有一些http://www.cs。uni-potsdam.de/rosoclingo/ – vukk

回答

1

您可以使用Python从sys.stdin与类似于以下(filter.py)的脚本阅读:

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

然后调用你的这样的管道:

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

我建议你把SPARK输出转储到文本文件,然后用你的工具解析它。

写一个shell脚本,它会为你:

python pythonfile.py | java -jar sparc.jar aspfile.sp > spark.out 
python parse_out.py spark.out 
相关问题