控制Python交互式shell的输入/输出

时间:2011-06-13 02:35:16

标签: python redirect ocaml stdout pipe

我必须评估(数百万)Python表达式,例如(int(a) >> 8 == 4) and b 在我的OCaml计划中。有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 个答案:

答案 0 :(得分:3)

我不打算评论整个概念的怪异性(驱动python来评估来自o'caml的表达式),但似乎你可能想要编写一个python程序,它是一个读取/的eval循环从/向管道写入字符串。查找eval命令。

答案 1 :(得分:2)

您可以通过命令行向解释器提供命令:

$ python -c 'a = 3; b = 5; print a > b'
False

这是否足以满足您的需求?

如果您担心重复打开解释器,可以一次生成并评估多个表达式。我不确定上限是多少,但我能够毫无问题地评估和打印200个a = 3; b = 5; print a > b;的连续副本。