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
для связи.
Я ищу возможности, которые лучше, чем я думал:
tagname
в окнах и другой метод синхронизации на других операционных системах. Переход с другим моим ответом оказался ошибкой. Из-за того, как ручки наследуются в python2 в Windows, я не мог получить то же самое решение для работы на машинах Windows. Я закончил использование более совершенных интерфейсов Listener
и Client
также найденных в модуле многопроцессорности.
Этот мой вопрос обсуждает эту ошибку.
После того, как некоторые мастерить с multiprocessing.Pipe
функции и multiprocesing.Connection
объектов возвращается, я понял, что сериализация Connection
объектов гораздо проще, чем я думал.
Объект Connection
имеет три свойства описания:
fileno
- ручка. Произвольный дескриптор файла в Unix и сокет в окнах.readable
- логическое управление доступом к объекту Connection.writable
- Логическое управление тем, может ли быть создан объект Connection. Все три свойства доступны как атрибуты объектов и управляются через конструктор класса Connection
.
Похоже, что если:
Pipe
порождает дочерний процесс и разделяет номер connection.fileno()
.Connection
используя этот дескриптор файла в качестве дескриптора.Connection
примерно одинаково (и это, вероятно, рискованная часть). Возможно Connection.send
и Connection.recv
между этими двумя процессами, хотя они не используют одну и ту же конструкцию интерпретатора, и модуль многопроцессорности фактически не использовался для создания экземпляра дочернего процесса.
РЕДАКТИРОВАТЬ:
Обратите внимание, что класс Connection
доступен как multiprocessing.connection.Connection
в python3 и как _multiprocessing.Connection
в python2 (который может предположить, что использование не рекомендуется YMMV)