Управление вводом / выводом интерактивной оболочки Python - PullRequest
3 голосов
/ 13 июня 2011

Я должен оценить (миллионы) выражений 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 ]

3 голосов
/ 13 июня 2011

Я не собираюсь комментировать странность всей концепции (заставляя python оценивать выражения из o'caml), но кажется, что вы могли бы захотеть написать программу на python, которая представляет собой цикл eval, который читает /пишет строку из / в трубу.Посмотрите команду eval.

2 голосов
/ 13 июня 2011

Вы можете передать команду переводчику через командную строку:

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

Это достаточно для ваших нужд?

Если вы хотите повторно открыть интерпретатор, вы можете сгенерировать и оценить много выражений одновременно. Я не уверен, каков верхний предел, но я смог оценить и напечатать 200 составных копий a = 3; b = 5; print a > b; без каких-либо проблем.

...