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

3
我需要在我的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。 有没有更好的方法? 我需要评估相当多的表达式,所以我不想通过临时文件来完成。 任何帮助都将不胜感激, 谢谢。


似乎Python在读取输入时会出现一些奇怪的问题。如果你打开“ocaml”而不是“python”作为你的进程,它就可以工作(当然,你需要改变你所写的内容)。如果你从命令行运行“python > output.txt”,它将把每个表达式的输出写入文件。但是,如果你执行“python < input.txt > output.txt”,它似乎不起作用,这让我得出结论,Python对stdin做了一些奇怪的事情。 - Niki Yoshiuchi
2个回答

3
我不打算评论整个概念的怪异性(使用Python来评估OCaml表达式),但是看起来您可能希望研究编写一个Python程序,它是一个评估周期,从/向管道读取/写入字符串。查找eval命令即可。

谢谢 - 当然最好的选择是在OCaml中编写一个表达式求值器。但是我想保持简单,当涉及浮点算术和类型转换时,它似乎非常复杂。 - user736608

2
您可以通过命令行向解释器提供指令:
$ python -c 'a = 3; b = 5; print a > b'
False

这是否满足您的需求?

如果您担心频繁打开解释器,您可以一次生成和评估许多表达式。我不确定上限是什么,但我能够评估并打印200个连接副本 a = 3; b = 5; print a > b; 没有任何问题。


谢谢 - 这是可能的,但我认为如果我这样做一百万次,那么很多时间将被浪费在加载解释器上。有没有可能在不重新执行的情况下“停留”在解释器中? - user736608
嗯...也许吧。但我不确定尝试与解释器进行接口交互是否是一个更好的想法。请参见上面的另一个建议。 - senderle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接