Is it possible to import and use third party matlab functions/packages in python?

5 次查看(过去 30 天)
I would like to call functions from packages that are imported in Matlab in Python using the MATLAB Engine API for Python. The import/setup work for the package I want to use is contained in load_javaplex.m:
% This script prepares the javaplex library for use
clc; clear all; close all;
%clear import;
javaaddpath('./lib/javaplex.jar');
import edu.stanford.math.plex4.*;
javaaddpath('./lib/plex-viewer.jar');
import edu.stanford.math.plex_viewer.*;
cd './utility';
addpath(pwd);
cd '..';
fprintf('DONE');
% This last line calls a function to test the library
api.Plex4.createExplicitSimplexStream()
In Python I tried the following:
import matlab.engine
eng = matlab.engine.start_matlab()
# prepare javaplex library for use
eng.load_javaplex(nargout=0)
eng.api.Plex4.createExplicitSimplexStream()
When the load_javaplex.m runs it successfully calls api.Plex4.createExplicitSimplexStream(), so we know the package is working in Matlab. But calling eng.api.Plex4.createExplicitSimplexStream() results in an undefined function error (output from running the Python code above):
DONE
ans =
edu.stanford.math.plex4.streams.impl.ExplicitSimplexStream@5e894fec
Undefined function or variable 'api.Plex4.createExplicitSimplexStream'.
Traceback (most recent call last):
File "/Users/alex/PycharmProjects/SeniorResearchProject/Code/sandbox/test2.py", line 6, in <module>
eng.api.Plex4.createExplicitSimplexStream()
File "/Users/alex/anaconda/lib/python2.7/site-packages/matlab/engine/matlabengine.py", line 84, in __call__
_stderr, feval=True).result()
File "/Users/alex/anaconda/lib/python2.7/site-packages/matlab/engine/futureresult.py", line 68, in result
return self.__future.result(timeout)
File "/Users/alex/anaconda/lib/python2.7/site-packages/matlab/engine/fevalfuture.py", line 82, in result
self._result = pythonengine.getFEvalResult(self._future,self._nargout, None, out=self._out, err=self._err)
matlab.engine.MatlabExecutionError: Undefined function or variable 'api.Plex4.createExplicitSimplexStream'.
Process finished with exit code 1
Is there a way to call these third party functions from Python?

采纳的回答

Robert Snoeberger
It looks like your problem is with import. I don't think the import that executes in your script, load_javaplex, is available when you try to call createExplicitSimplexStream. Try using the full name instead of the shortened name. I would guess that the full name is edu.stanford.math.plex4.api.Plex4.createExplicitSimplexStream. Example:
% Use the full name
eng.edu.stanford.math.plex4.api.Plex4.createExplicitSimplexStream()
  1 个评论
Alexander Williams
This does work, but the matlab engine api is unable to handle the custom datatype (a java object) returned by the function call:
Traceback (most recent call last):
File "/Users/alex/PycharmProjects/SeniorResearchProject/Code/sandbox/test2.py", line 8, in <module>
eng.edu.stanford.math.plex4.api.Plex4.createExplicitSimplexStream()
File "/Users/alex/anaconda/lib/python2.7/site-packages/matlab/engine/matlabengine.py", line 84, in __call__
_stderr, feval=True).result()
File "/Users/alex/anaconda/lib/python2.7/site-packages/matlab/engine/futureresult.py", line 68, in result
return self.__future.result(timeout)
File "/Users/alex/anaconda/lib/python2.7/site-packages/matlab/engine/fevalfuture.py", line 82, in result
self._result = pythonengine.getFEvalResult(self._future,self._nargout, None, out=self._out, err=self._err)
TypeError: unsupported data type returned from MATLAB
I think I will just keep all calls to the java library in matlab code for now. Since you did technically answer my question I accepted. Thanks for responding!

请先登录,再进行评论。

更多回答(1 个)

Bo Li
Bo Li 2017-1-9
It looks that "api.Plex4.createExplicitSimplexStream()" is a Java API and it works when it is called by Python Engine as part of load_javaplex.m, while calling eng.api.Plex4.createExplicitSimplexStream() directly from Python fails.
Python Engine works as the MATLAB command "feval" does:
Most likely, calling "feval('api.Plex4.createExplicitSimplexStream')" in MATLAB will also fail. In such case, besides wrapping the Java API inside a M function, you may also invoke the Java API with eval in Python:
>>>eng.eval('api.Plex4.createExplicitSimplexStream', nargout=0)
  1 个评论
Alexander Williams
eng.eval('api.Plex4.createExplicitSimplexStream', nargout=0)
results in
matlab.engine.MatlabExecutionError: Undefined variable "api" or class "api.Plex4.createExplicitSimplexStream".
I have decided to keep all calls to the java package in matlab code because of the issue mentioned in my comment above.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Call MATLAB from Python 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by