Python Mlab - Name find_available_releases kann nicht importiert werden

8

Ich bin neu in Python. Ich versuche, MATLAB innerhalb von Python mit dem mlab -Paket auszuführen. Ich folgte der Anleitung auf der Website , und ich trat in die Python-Befehlszeile ein:

%Vor%

Der Fehler, den ich bekam, war:

%Vor%

Es scheint, dass unter matlabcom.py keine find_available_releases Funktion vorhanden war.

Darf ich wissen, ob jemand weiß, wie man das löst? Danke!

PS: Ich benutze Windows 7, MATLAB 2012a und Python 2.7

    
KSS 18.12.2013, 13:33
quelle

2 Antworten

6

Ich habe den Code überflogen, und ich denke nicht an die README -Datei und seine Dokumentation entspricht dem, was tatsächlich implementiert wurde. Es scheint hauptsächlich aus dem ursprünglichen Projekt mlabwrap kopiert zu werden.

Das ist verwirrend, da mlabwrap mit einem C-Erweiterungsmodul implementiert wurde, um mit < MATLAB Engine API . Der Code mlab scheint diesen Teil jedoch durch eine reine Python-Implementierung als MATLAB-Bridge-Backend ersetzt zu haben. Es kommt von "Dana Pe'er Lab" und Je nach Plattform ( COM / ActiveX <) werden zwei verschiedene Methoden verwendet, um mit MATLAB zu interagieren / a> unter Windows und Pipes unter Linux / Mac).

Nachdem wir nun verstanden haben, wie das Backend implementiert ist, können Sie sich den Importfehler ansehen.

Hinweis: Der Linux / Mac-Teil des Codes versucht, die ausführbare MATLAB-Datei an einigen fest codierten Stellen und ermöglicht die Auswahl zwischen verschiedenen Versionen.

Sie arbeiten jedoch an Windows, und der Code implementiert wirklich keine Möglichkeit, zwischen MATLAB-Releases für diese Plattform zu wählen (also sind alle Methoden wie discover_location und find_available_releases unter Windows nutzlos). Am Ende wird das COM-Objekt als erstellt:

%Vor%

Als hier erklärt , die ProgID matlab.application ist nicht versionsspezifisch und verwendet einfach das, was registriert als Standard-MATLAB-COM-Server. Wir können explizit angeben, welche MATLAB-Version wir haben möchten (vorausgesetzt, Sie haben mehrere Installationen), zum Beispiel wählt matlab.application.8.3 MATLAB R2014a.

Um also den Code zu reparieren, wäre IMO der einfachste Weg, die ganze Logik über mehrere MATLAB-Versionen loszuwerden (im Windows-Teil des Codes ), und lass es einfach das MATLAB-COM-Objekt erstellen, wie es ist. Ich habe es nicht versucht, aber ich glaube nicht, dass es zu kompliziert ist ... Viel Glück!

BEARBEITEN:

Ich habe das Modul heruntergeladen und es geschafft, es unter Windows zu benutzen (ich benutze Python 2.7.6 und MATLAB R2014a). Hier sind die Änderungen:

%Vor%

Zuerst habe ich die fehlende Funktion find_available_releases hinzugefügt. Ich habe es so gemacht, dass es meldet, dass alle MATLAB-Versionen verfügbar sind (wie ich oben erklärt habe, ist es nicht wirklich wichtig wegen der Art, wie das COM-Objekt erstellt wird). Eine noch bessere Lösung wäre, die installierten / registrierten MATLAB-Versionen über die Windows-Registrierung zu erkennen (überprüfen Sie die Schlüssel HKCR\Matlab.Application.X.Y und folgen Sie deren CLSID in HKCR\CLSID ). Auf diese Weise können Sie wirklich auswählen und auswählen, welche Version ausgeführt werden soll.

Ich habe auch zwei nicht zusammenhängende Fehler behoben (einen, bei dem der Autor den Rückgabewert der Funktion vergessen hat und der andere unnötigerweise das Wrapper-Objekt zweimal erstellt hat).

Hinweis: Während des Tests ist es möglicherweise schneller, eine MATLAB-Instanz nicht jedes Mal, wenn das Skript aufgerufen wird, zu starten / herunterzufahren. Aus diesem Grund habe ich self.eval('quit();') in der Funktion close kommentiert. Auf diese Weise können Sie MATLAB starten mit matlab.exe -automation (dies nur einmal tun) und verwenden Sie die Sitzung dann wiederholt, ohne sie zu beenden. Beenden Sie einfach den Vorgang, wenn Sie fertig sind:)

Hier ist ein Python-Beispiel zum Testen des Moduls (ich zeige auch einen Vergleich mit NumPy / SciPy / Matplotlib):

test_mlab.py

%Vor%

Hier ist die Ausgabe, die ich bekomme:

%Vor%

EDIT2:

Die obigen Änderungen wurden akzeptiert und in mlab zusammengeführt.

    
Amro 15.07.2014 16:08
quelle
1

Sie haben recht damit, dass find_available_releases () nicht geschrieben wird. 2 Möglichkeiten, dies auszuarbeiten

  • Sieh dir den Code in linux an und arbeite daran (du arbeitest gerade Fenster!)
  • Ändern Sie den Code wie folgt

Fügen Sie die folgende Funktion in matlabcom.py wie in matlabpipe.py

hinzu %Vor%

Wenn Sie die Datei mlabraw.py sehen, wird Ihnen der folgende Code eine klare Vorstellung davon geben, warum ich das sage!

%Vor%     
Abhishesh Sharma 15.07.2014 10:07
quelle