Aus Matlab subprocess.call mit stdin und stdout ausführen führt zu fehler "[WinError 6] Das Handle ist ungültig", warum?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Dienstag 10. Mai 2016, 11:19

Hallo,

ich will aus einem Matlab-Skript heraus eine Python-Funktion ausführen, die wiederum mittels subprocess.call Matlab ausführt.

Hintergrund:

Ich will aus einer 64-Bit-Version von Matlab die 32-Bit-Version von Matlab zentral ausführen um ein 32-Bit-Simulink-Modell auszuführen. Daher brauche ich Python als Middleware.

Hier mein Code im Matlab-Skript:

Code: Alles auswählen

clear classes
mod = py.importlib.import_module('funktionen');
py.importlib.reload(mod);
py.funktionen.simStartParkTEST() %Hier wird die Python-Funktion ausgeführt
Nun der Code in Python:

Code: Alles auswählen

def simStartParkTEST():
    """ simuliert einen Park """ 

    import subprocess
    subprocess.call([r"C:\Program Files (x86)\MATLAB\R2012b\bin\matlab.exe","-nosplash", "-nodesktop","-wait","-softwareopengl", "-r","disp('Hallo')"])

    #subprocess.call([r"C:\Program Files (x86)\MATLAB\R2012b\bin\matlab.exe","-nosplash", "-nodesktop","-wait","-softwareopengl", "-r","disp('Hallo')"],stdout=subprocess.PIPE,stdin=subprocess.PIPE)


    print("DONE simStartPark4")
Der obige Python-Code funktioniert. Aber nur, weil ich stdout=subprocess.PIPE,stdin=subprocess.PIPE aus dem Funktionskopf von call rausgenomen hat. Wenn ich den unteren Funktionsaufruf wieder unkommentiere, erhalte ich folgenden Fehler:
Error using subprocess>_make_inheritable (line 1062)
Python Error: OSError: [WinError 6] Das Handle ist ungültig

Error in subprocess>_get_handles (line 1050)
errwrite = self._make_inheritable(errwrite)

Error in subprocess>__init__ (line 813)
errread, errwrite) = self._get_handles(stdin, stdout, stderr)

Error in subprocess>call (line 535)
with Popen(*popenargs, **kwargs) as p:

Error in funktionen>simStartParkTEST (line 164)
subprocess.call([r"C:\Program Files (x86)\MATLAB\R2012b\bin\matlab.exe","-nosplash",
"-nodesktop","-wait","-softwareopengl", "-r","disp('Hallo')"],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
Wenn ich die Python-Funktion direkt aus Python starte, erhalte ich diesen Fehler nicht!

Weiss jemand, warum bei Ausführen aus Matlab heraus sich der Fehler Python Error: OSError: [WinError 6] Das Handle ist ungültig einstellt und was dieser zu bedeuten hat?
BlackJack

Dienstag 10. Mai 2016, 11:32

@GPD: Hat der externe Prozess vielleicht keine Standard- und Fehlerausgabe‽ Unter Windows gibt es ja die Unterscheidung zwischen Konsolen- und Windowsanwendungen und letztere haben die Standard-Ein- und Ausgaben nicht.
GPD
User
Beiträge: 19
Registriert: Freitag 8. April 2016, 08:22

Dienstag 10. Mai 2016, 11:59

Achso, dann ist der Fehler "Das Handle ist ungültig" aber etwas irreführend.

Aber vielen Dank BlackJack!
BlackJack

Dienstag 10. Mai 2016, 13:04

@GPD: Finde ich nicht. Die Standard-Ein- und Ausgaben haben standardisierte Handles. Und wenn man versucht etwas mit so einem Handle zu machen, das man ja als Programmierer an der Stelle in der Hand hat, es gibt das Handle ja, dann kommt halt der Fehler dass dieses Handle ungültig ist.
Antworten