【问题标题】:Controlling input/output of Python interactive shell控制 Python 交互式 shell 的输入/输出
【发布时间】:2011-09-13 15:32:57
【问题描述】:

我必须评估(数百万个)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。 有没有更好的方法来做到这一点?我需要评估很多 表达式,所以我真的不想通过临时文件来做到这一点。任何帮助表示赞赏, 谢谢。

【问题讨论】:

  • 似乎 python 在读取其输入时做了一些奇怪的事情。如果不是打开“python”作为您的进程,而是打开“ocaml”,它会起作用(并且您显然会更改您正在编写的内容)。如果您从命令行运行“python > output.txt”,它会将每个表达式的输出写入文件。但是,如果您执行“python output.txt”,它似乎不起作用,这使我得出结论,python 对标准输入做了一些奇怪的事情。

标签: python redirect ocaml stdout pipe


【解决方案1】:

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

【讨论】:

  • 谢谢 - 当然最好的选择是在 OCaml 中编写表达式求值器。但是我想保持简单,它似乎非常复杂,尤其是在涉及浮点算术和类型转换时。
【解决方案2】:

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

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

这足以满足您的需求吗?

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

【讨论】:

  • 谢谢 - 这是可能的,但我认为如果我这样做一百万次,那么加载解释器会浪费很多时间。是否有可能在解释器中“停留”而不每次都重新执行?
  • 嗯……也许吧。但我不确定尝试与解释器交互是一个更好的主意。其他建议见上文。
猜你喜欢
  • 1970-01-01
  • 2014-02-28
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2020-12-01
  • 2017-11-23
  • 2011-11-01
相关资源
最近更新 更多