Como um script Python em execução no Linux chamaria uma rotina em um script Python em execução no Wine?

Eu tenho um script Python (3) em execução no Linux, chamado de script principal, que precisa chamar uma rotina de uma DLL proprietária. Até agora, resolvi isso com o Wine usando a seguinte construção:

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

O scriptdll_call.py é executado por um intérprete do Windows Python (3) instalado no Wine. Ele despeja os valores retornados em um arquivo que é captado pelo script principal em espera. Não é exatamente confiável e dolorosamente lento se eu tiver que fazer isso algumas vezes seguidas.

Eu gostaria de começar o scriptdll_call.py uma vez, oferecendo algum tipo de servidor simples, que deve expor a rotina necessária de alguma forma. No final do dia, eu gostaria de ter um script principal parecido com este:

# 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)

Como isso pode ser melhor implementado (se a velocidade é necessária e a segurança não é uma preocupação)?

Obrigado @jsbueno e @AustinHastings por suas respostas e sugestões.

Para quem tem problemas semelhantes: inspirado nas respostas mencionadas,Eu escrevi um pequeno módulo Python para chamar DLLs do Windows a partir do Python no Linux. Ele é baseado no IPC entre um processo Python Linux / Unix comum e um processo Python baseado em Wine. Como eu precisava dele em muitos casos / cenários de uso diferentes, eu o projetei como um "genérico"ctypes módulo substituição drop-in, que realiza a maior parte do encanamento necessário automaticamente em segundo plano.

Exemplo: Suponha que você esteja em Python no Linux, tenha o Wine instalado e deseje entrar em contato commsvcrt.dll (a biblioteca de tempo de execução do Microsoft C). Você pode fazer o seguinte:

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))

Código fonte (LGPL), Pacote PyPI & documentação. Ainda é um pouco áspero nas bordas (ou seja, alfa e inseguro), mas lida com a maioria dos tipos de parâmetros (incluindo ponteiros).

questionAnswers(2)

yourAnswerToTheQuestion