Я пишу программу на C ++, которая будет запускать интерпретатор Python 3 как дочерний процесс, затем подключать два анонимных канала Linux - один к его stdout
и stderr
, а второй к stdin
интерпретатора; далее общайтесь с ним по этим каналам.
Мне нужно запустить Python в интерактивном режиме, то есть передать ему одну команду с помощью входного канала и дождаться ответа на выходном канале. Все бы хорошо, но кажется, что Python может работать в интерактивном режиме, только если он stdout
и stdin
подключен к tty.
Цитата документов Python:
Интерпретатор работает подобно оболочке Unix: при вызове со стандартным вводом, подключенным к tty-устройству, он читает и выполняет команды в интерактивном режиме; при вызове с аргументом имени файла или с файлом в качестве стандартного ввода он читает и выполняет сценарий из этого файла.
Действительно, когда я запускаю интерпретатор с каналами вместо tty, я не вижу ничего в ответном канале после отправки команды.
Итак, могу ли я каким-то образом обойти такое поведение и заставить интерпретатор python3 работать точно так, как он был запущен с терминала пользователем?
Опять проблема в двух словах:
Мне нужно интегрировать Python в мое приложение на сервере C ++, чтобы клиенты могли выполнять команды python.
Встраивание интерпретатора в сервер выглядит плохой идеей, в основном по соображениям безопасности (пользователи могут повредить сервер или его данные, кроме того, сервер работает с некоторыми привилегиями, которые я не хочу предоставлять пользователям).
Другое возможное решение - использовать интерпретатор в режиме CLI (командный режим). Основная проблема заключается в том, что мне нужно импортировать некоторые модули и предварительно выполнить некоторый код, чтобы предоставить свою серверную среду и немного API для пользователей. Это будет слишком тяжело сделать перед вызовом интерпретатора с каждой командой (эти действия довольно сложные, включая установление сетевого соединения)
Таким образом, запуск интерпретатора в отдельном процессе и взаимодействие сервера с ним с использованием механизмов IPC выглядит неплохой идеей.
В любом случае, я буду рад взглянуть на ваши предложения, если они у вас есть.