Как скрипт Python, работающий в Linux, может вызвать процедуру в скрипте Python, выполняемую под Wine?

У меня есть скрипт Python (3), работающий в Linux, называемый основным скриптом, который должен вызывать подпрограмму из проприетарной DLL. До сих пор я решил это с помощью Wine, используя следующую конструкцию:

# Main script running on Linux
import subprocess
# [...]
subprocess.Popen('echo "python dll_call.py %s" | wine cmd &' % options, shell = True)
# [...]

Сценарийdll_call.py выполняется интерпретатором Windows Python (3), установленным под Wine. Он сбрасывает возвращаемые значения в файл, который затем выбирается ожидающим основным сценарием. Это не совсем надежно и мучительно медленно, если мне придется делать это несколько раз подряд.

Я хотел бы запустить сценарийdll_call.py однажды, предлагая некоторый тип простого сервера, который должен предоставлять требуемую подпрограмму в некотором роде. В конце дня мне бы хотелось, чтобы основной сценарий выглядел примерно так:

# Main script running on Linux
import subprocess
# [...]
subprocess.Popen('echo "python dll_call_server.py" | wine cmd &', shell = True)
# [...]
return_values = call_into_dll(options)

Как это можно реализовать наилучшим образом (если требуется скорость и безопасность не является проблемой)?

Спасибо @jsbueno и @AustinHastings за ваши ответы и предложения.

Для тех, у кого есть похожие проблемы: вдохновленные упомянутыми ответами,Я написал небольшой модуль Python для вызова в Windows DLL из Python на Linux. Он основан на IPC между обычным процессом Python для Linux / Unix и процессом Python на основе Wine. Поскольку я нуждался в этом в слишком многих различных сценариях использования / сценариях, я разработал его как «универсальный»ctypes модуль вставная замена, которая автоматически выполняет большую часть необходимой сантехники в фоновом режиме.

Пример: предположим, что вы работаете в Python под Linux, у вас установлен Wine и вы хотите вызватьmsvcrt.dll (библиотека времени выполнения Microsoft C). Вы можете сделать следующее:

import zugbruecke as ctypes
dll_pow = ctypes.cdll.msvcrt.pow
dll_pow.argtypes = (ctypes.c_double, ctypes.c_double)
dll_pow.restype = ctypes.c_double
print('You should expect "1024.0" to show up here: "%.1f".' % dll_pow(2.0, 10.0))

Исходный код (LGPL), Пакет PyPI & документация, Он все еще немного груб по краям (то есть альфа и небезопасен), но он обрабатывает большинство типов параметров (включая указатели).

Ответы на вопрос(2)

Ваш ответ на вопрос