控制Python交互式Shell的输入/输出
我需要在我的OCaml程序中评估(数百万个)Python表达式,比如 (int(a) >> 8 == 4) and b
。虽然有个叫 pycaml
的东西,但我没能让它正常工作。
所以我想到了另一个办法:直接控制Python解释器的输入和输出。
理想情况下,我想要拦截解释器的输入和输出。比如我发送 a = 3
b = 5
a > b
给解释器,这样我就能得到结果 False
,就像我用键盘输入一样。
>>> a = 3
>>> b = 5
>>> a > b
False
>>>
不过,我的代码没有按预期工作(而且同样的代码在某些交互式程序中是可以用的)。
let (readme, writeme) = Unix.open_process "python -u";;
let _ = output_string writeme "3 + 5\n" in
let _ = flush writeme in
let result = input_line readme in
print_endline result;;
我试着把 3 + 5\n
改成 print 3\n
,但它还是在 input_line
这儿卡住了。有没有更好的办法呢?我需要评估很多表达式,所以我不想通过临时文件来处理。任何帮助都很感激,谢谢。
2 个回答
2
你可以通过命令行给解释器输入指令:
$ python -c 'a = 3; b = 5; print a > b'
False
这样做对你来说够用吗?
如果你担心要反复打开解释器,你可以一次性生成并计算多个表达式。我不太确定最大能处理多少,但我成功地计算并打印了200个连在一起的代码,内容是a = 3; b = 5; print a > b;
,没有遇到任何问题。
3
我不打算评论这个概念有多奇怪(让Python去执行o'caml的表达式),但看起来你可能想写一个Python程序,这个程序可以在一个循环中读取和写入字符串到一个管道中。你可以查一下eval这个命令。