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

3 投票
2 回答
966 浏览
提问于 2025-04-16 19:26

我需要在我的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这个命令。

撰写回答