¿Cómo llamaría un script de Python que se ejecuta en Linux a una rutina en un script de Python que se ejecuta en Wine?

Tengo una secuencia de comandos Python (3) ejecutándose en Linux, conocida como la secuencia de comandos principal, que tiene que llamar a una rutina desde una DLL propietaria. Hasta ahora, he resuelto esto con Wine usando la siguiente construcción:

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

La secuencia de comandosdll_call.py es ejecutado por un intérprete de Windows Python (3) instalado en Wine. Vuelca los valores de retorno en un archivo que luego es recogido por el script principal en espera. No es exactamente confiable y extremadamente lento si tengo que hacer esto varias veces seguidas.

Me gustaría comenzar el guióndll_call.py una vez, ofreciendo algún tipo de servidor simple, que debería exponer la rutina requerida de alguna manera. Al final del día, me gustaría tener un script principal que se parezca a esto:

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

¿Cómo se puede implementar esto mejor (si se requiere velocidad y la seguridad no es una preocupación)?

Gracias @jsbueno y @AustinHastings por sus respuestas y sugerencias.

Para aquellos que tienen problemas similares: inspirados por las respuestas mencionadas,Escribí un pequeño módulo de Python para llamar a las DLL de Windows desde Python en Linux. Se basa en IPC entre un proceso regular de Linux / Unix Python y un proceso de Python basado en Wine. Como lo he necesitado en muchos casos / escenarios de uso diferentes, lo diseñé como un "genérico"ctypes módulo reemplazo directo, que realiza la mayoría de las tuberías necesarias automáticamente en segundo plano.

Ejemplo: suponga que está en Python en Linux, tiene Wine instalado y desea llamarmsvcrt.dll (la biblioteca de tiempo de ejecución de Microsoft C). Puedes hacer lo siguiente:

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 fuente (LGPL), Paquete PyPI & documentación. Todavía es un poco áspero en los bordes (es decir, alfa e inseguro), pero maneja la mayoría de los tipos de parámetros (incluidos los punteros).

Respuestas a la pregunta(2)

Su respuesta a la pregunta