- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 Python 新手。我正在尝试使用 mlab 从 Python 内部运行 MATLAB包裹。我正在按照 the website 上的指南进行操作,我在 Python 命令行中输入了这个:
from mlab.releases import latest_release
我得到的错误是:
cannot import name find_available_releases
好像在matlabcom.py
下没有find_available_releases
函数。
请问有谁知道怎么解决吗?谢谢!
PS:我使用的是 Windows 7、MATLAB 2012a 和 Python 2.7
最佳答案
我浏览了代码,我不认为所有 README文件及其文档与实际实现的相匹配。它似乎主要是从原版复制的 mlabwrap
项目。
这令人困惑,因为 mlabwrap
是使用 C extension module 实现的与 MATLAB Engine API 互动.然而,mlab
代码似乎已将那部分替换为纯 Python 实现作为 MATLAB 桥后端。来自"Dana Pe'er Lab"它使用两种不同的方法与 MATLAB 交互,具体取决于平台(Windows 上的 COM/ActiveX 和 Linux/Mac 上的 pipes)。
既然我们了解了后端是如何实现的,您就可以开始查看导入错误了。
注意:代码的 Linux/Mac 部分 tries to find一些硬编码的固定位置中的 MATLAB 可执行文件,并允许在不同版本之间进行选择。
但是您是在 Windows 上工作,并且代码并没有真正实现在该平台的 MATLAB 版本之间进行选择的任何方式(因此所有方法,如 discover_location
和 find_available_releases
在 Windows 上没有用)。最后,COM对象是created as :
self.client = win32com.client.Dispatch('matlab.application')
作为explained here , ProgID matlab.application
不是特定于版本的,并且将简单地使用 registered 中的任何内容作为默认的 MATLAB COM 服务器。我们可以明确指定我们想要的 MATLAB 版本(假设您有多个安装),例如 matlab.application.8.3
将选择 MATLAB R2014a。
因此,要修复代码,IMO 最简单的方法是摆脱所有关于多个 MATLAB 版本的逻辑(在 Windows part of the code 中),并让它按原样创建 MATLAB COM 对象。我没有尝试过,但我不认为它涉及太多......祝你好运!
我下载了该模块并设法让它在 Windows 上运行(我使用的是 Python 2.7.6 和 MATLAB R2014a)。以下是更改:
$ git diff
diff --git a/src/mlab/matlabcom.py b/src/mlab/matlabcom.py
index 93f075c..da1c6fa 100644
--- a/src/mlab/matlabcom.py
+++ b/src/mlab/matlabcom.py
@@ -21,6 +21,11 @@ except:
print 'win32com in missing, please install it'
raise
+def find_available_releases():
+ # report we have all versions
+ return [('R%d%s' % (y,v), '')
+ for y in range(2006,2015) for v in ('a','b')]
+
def discover_location(matlab_release):
pass
@@ -62,7 +67,7 @@ class MatlabCom(object):
"""
self._check_open()
try:
- self.eval('quit();')
+ pass #self.eval('quit();')
except:
pass
del self.client
diff --git a/src/mlab/mlabraw.py b/src/mlab/mlabraw.py
index 3471362..16e0e2b 100644
--- a/src/mlab/mlabraw.py
+++ b/src/mlab/mlabraw.py
@@ -42,6 +42,7 @@ def open():
if is_win:
ret = MatlabConnection()
ret.open()
+ return ret
else:
if settings.MATLAB_PATH != 'guess':
matlab_path = settings.MATLAB_PATH + '/bin/matlab'
diff --git a/src/mlab/releases.py b/src/mlab/releases.py
index d792b12..9d6cf5d 100644
--- a/src/mlab/releases.py
+++ b/src/mlab/releases.py
@@ -88,7 +88,7 @@ class MatlabVersions(dict):
# Make it a module
sys.modules['mlab.releases.' + matlab_release] = instance
sys.modules['matlab'] = instance
- return MlabWrap()
+ return instance
def pick_latest_release(self):
return get_latest_release(self._available_releases)
首先,我添加了缺少的 find_available_releases
函数。我这样做是为了让它报告所有 MATLAB 版本都可用(就像我上面解释的那样,这并不重要,因为 COM 对象的创建方式不同)。更好的解决方法是使用 Windows 注册表检测已安装/注册的 MATLAB 版本(检查键 HKCR\Matlab.Application.X.Y
并在 HKCR\CLSID
中跟踪它们的 CLSID >).这样您就可以真正选择要运行的版本。
我还修复了两个不相关的错误(一个是作者忘记了函数返回值,另一个是不必要地创建了两次包装器对象)。
注意:在测试期间,每次调用脚本时不启动/关闭 MATLAB 实例可能会更快。这就是为什么我在 close
函数中注释了 self.eval('quit();')
的原因。这样你就可以start MATLAB使用 matlab.exe -automation
(只执行一次),然后在不关闭 session 的情况下重复使用该 session 。完成后就终止进程:)
这是一个测试模块的 Python 示例(我还展示了与 NumPy/SciPy/Matplotlib 的比较):
# could be anything from: latest_release, R2014b, ..., R2006a
# makes no difference :)
from mlab.releases import R2014a as matlab
# show MATLAB version
print "MATLAB version: ", matlab.version()
print matlab.matlabroot()
# compute SVD of a NumPy array
import numpy as np
A = np.random.rand(5, 5)
U, S, V = matlab.svd(A, nout=3)
print "S = \n", matlab.diag(S)
# compare MATLAB's SVD against Scipy's SVD
U, S, V = np.linalg.svd(A)
print S
# 3d plot in MATLAB
X, Y, Z = matlab.peaks(nout=3)
matlab.figure(1)
matlab.surf(X, Y, Z)
matlab.title('Peaks')
matlab.xlabel('X')
matlab.ylabel('Y')
matlab.zlabel('Z')
# compare against matplotlib surface plot
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='jet')
ax.view_init(30.0, 232.5)
plt.title('Peaks')
plt.xlabel('X')
plt.ylabel('Y')
ax.set_zlabel('Z')
plt.show()
这是我得到的输出:
C:\>python test_mlab.py
MATLAB version: 8.3.0.532 (R2014a)
C:\Program Files\MATLAB\R2014a
S =
[[ 2.41632007]
[ 0.78527851]
[ 0.44582117]
[ 0.29086795]
[ 0.00552422]]
[ 2.41632007 0.78527851 0.44582117 0.29086795 0.00552422]
以上改动已经accepted并合并到mlab
。
关于Python Mlab - 无法导入名称 find_available_releases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20659616/
我是 Python 新手。我正在尝试使用 mlab 从 Python 内部运行 MATLAB包裹。我正在按照 the website 上的指南进行操作,我在 Python 命令行中输入了这个: fro
我是一名优秀的程序员,十分优秀!