Межпроцессное взаимодействие с модифицированным интерпретатором Python

1

TL; DR: Как я могу создать другой интерпретатор python (изнутри python) и создать канал связи между родителем и дочерним элементом, когда stdin/stdout недоступны?


Я хотел бы, чтобы мой скрипт python выполнял модифицированный интерпретатор python и через какой-то IPC, такой как multiprocessing.Pipe взаимодействует со сценарием, который выполняет интерпретатор.

Допустим, у меня есть что-то похожее на следующее:

subprocess.Popen(args=["/my_modified_python_interpreter.exe",
                       "--my_additional_flag",
                       "my_python_script.py"])

Который работает отлично и хорошо, выполняет мой скрипт python и все.

Теперь я хотел бы установить некоторую межпроцессную связь с этим модифицированным интерпретатором python.

В идеале я хотел бы поделиться чем-то похожим на одно из возвращаемых значений из multiprocessing.Pipe(), однако мне нужно будет поделиться этим объектом с измененным процессом python (и я подозреваю, что multiprocessing.Pipe не справится с этим, даже если Я делаю это).

Хотя отправка текста и двоичного файла будет достаточным (мне не нужно делиться объектами python или чем-либо еще), мне нужно, чтобы это было функционально на всех основных операционных системах (Windows, Linux, Mac).

Еще несколько примеров использования/бизнеса

Более конкретно, модифицированный интерпретатор является интерпретатором IDAPython, который поставляется с IDA для разрешения сценариев в инструменте IDA.

К сожалению, поскольку stdio уже активно используется для существующих функций пользовательского интерфейса (предоставляется IDA), я не могу использовать stdin/stdout для связи.


Я ищу возможности, которые лучше, чем я думал:

  1. Используйте два (rx и tx) файла жесткого диска и передайте пути как в качестве аргументов.
  2. Используйте локальный сокет и передайте путь в качестве аргумента.
  3. Используйте файл с отображением памяти и tagname в окнах и другой метод синхронизации на других операционных системах.
  • 0
    Если вы не объясните точную природу изменений и не покажете, какой скрипт вы используете, вам трудно помочь. Самое простое, что можно сделать, это, вероятно, просто написать скрипт, который читает stdin, который вы передаете в него, и выводит соответствующий stdout.
  • 0
    @MadPhysicist Я согласен, что конкретные модификации могут усложнить эту задачу, но я искренне думаю, что этот вопрос относится к общему случаю разных интерпретаторов Python. Могу ли я попросить вас быть более точным в отношении недостающей информации? Обратите внимание, что я упомянул (и теперь объяснил), что stdio мне недоступен.
Показать ещё 2 комментария
Теги:
multiprocessing
ipc

2 ответа

0
Лучший ответ

Переход с другим моим ответом оказался ошибкой. Из-за того, как ручки наследуются в python2 в Windows, я не мог получить то же самое решение для работы на машинах Windows. Я закончил использование более совершенных интерфейсов Listener и Client также найденных в модуле многопроцессорности.

Этот мой вопрос обсуждает эту ошибку.

0

После того, как некоторые мастерить с multiprocessing.Pipe функции и multiprocesing.Connection объектов возвращается, я понял, что сериализация Connection объектов гораздо проще, чем я думал.

Объект Connection имеет три свойства описания:

  1. fileno - ручка. Произвольный дескриптор файла в Unix и сокет в окнах.
  2. readable - логическое управление доступом к объекту Connection.
  3. writable - Логическое управление тем, может ли быть создан объект Connection.

Все три свойства доступны как атрибуты объектов и управляются через конструктор класса Connection.

Похоже, что если:

  1. Процесс вызова Pipe порождает дочерний процесс и разделяет номер connection.fileno().
  2. Детский процесс создает объект Connection используя этот дескриптор файла в качестве дескриптора.
  3. Оба переводчика реализуют объект Connection примерно одинаково (и это, вероятно, рискованная часть).

Возможно Connection.send и Connection.recv между этими двумя процессами, хотя они не используют одну и ту же конструкцию интерпретатора, и модуль многопроцессорности фактически не использовался для создания экземпляра дочернего процесса.

РЕДАКТИРОВАТЬ:

Обратите внимание, что класс Connection доступен как multiprocessing.connection.Connection в python3 и как _multiprocessing.Connection в python2 (который может предположить, что использование не рекомендуется YMMV)

  • 0
    Вы, скорее всего, не столкнетесь с какими-либо проблемами, если соединение является просто оберткой для базовых системных методов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню