gpt4 book ai didi

Python Mlab - 无法导入名称 find_available_releases

转载 作者:太空狗 更新时间:2023-10-29 21:01:10 24 4
gpt4 key购买 nike

我是 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_locationfind_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 的比较):

test_mlab.py

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

matlab_peaks_surf matplotlib_peaks_surf


编辑2:

以上改动已经accepted并合并到mlab

关于Python Mlab - 无法导入名称 find_available_releases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20659616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com