Wie würde ein Python-Skript, das unter Linux ausgeführt wird, eine Routine in einem Python-Skript aufrufen, das unter Wine ausgeführt wird?

Ich habe ein Python (3) -Skript unter Linux, das als Hauptskript bezeichnet wird und eine Routine aus einer proprietären DLL aufrufen muss. Bisher habe ich dies mit Wine mit dem folgenden Konstrukt gelöst:

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

Das Skript dll_call.py wird von einem Windows Python (3) -Interpreter ausgeführt, der unter Wine installiert ist. Die Rückgabewerte werden in eine Datei geschrieben, die dann vom wartenden Hauptskript abgerufen wird. Es ist nicht gerade zuverlässig und quälend langsam, wenn ich das ein paar Mal hintereinander machen muss.

Ich möchte das Skript starten dll_call.py once, bietet einen einfachen Servertyp, der die erforderliche Routine auf irgendeine Weise verfügbar machen sollte. Am Ende des Tages hätte ich gerne ein Hauptskript, das ungefähr so aussieht:

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

Wie lässt sich dies am besten umsetzen (wenn Geschwindigkeit und Sicherheit keine Rolle spielen)?

Vielen Dank an @jsbueno und @AustinHastings für Ihre Antworten und Vorschläge.

Für diejenigen mit ähnlichen Problemen: Inspiriert von den genannten Antworten,Ich habe ein kleines Python-Modul geschrieben für den Aufruf von Windows-DLLs aus Python unter Linux. Es basiert auf IPC zwischen einem regulären Linux / Unix-Python-Prozess und einem Wine-basierten Python-Prozess. Da ich es in zu vielen verschiedenen Anwendungsfällen / Szenarien benötigt habe, habe ich es als "generisches"ctypes module Drop-In-Ersatz, der die meisten erforderlichen Installationsarbeiten automatisch im Hintergrund ausführt.

Beispiel: Angenommen, Sie sind in Python unter Linux, haben Wine installiert und möchten @ aufrufemsvcrt.dll (die Microsoft C-Laufzeitbibliothek). Sie können Folgendes tun:

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

Quellcode (LGPL), PyPI-Paket & Dokumentatio. Es ist immer noch etwas rau an den Rändern (d. H. Alpha und unsicher), aber es verarbeitet die meisten Arten von Parametern (einschließlich Zeigern).

Antworten auf die Frage(4)

Ihre Antwort auf die Frage