为什么MATLAB不能导入这个python库?

2024-05-29 09:53:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在MATLAB中使用http://www.losonczylab.org/sima/1.2/。在

我可以从python运行它。在

我可以在MATLAB中导入示例依赖项。在

$ /opt/local/bin/python 
Python 2.7.9 (default, Dec 13 2014, 15:13:49) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from sima import sequence 
>>> sequence 
<module 'sima.sequence' from '/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/sequence.pyc'> 
>>> from sima import Imagingdataset 
>>> ImagingDataset 
<class 'sima.imaging.ImagingDataset'> 

在MATLAB中:

^{pr2}$

我怎样才能找出为什么不能导入sima?在

sima在路径上:

>> pp = py.pprint.PrettyPrinter

pp = 

  Python PrettyPrinter with no properties.

    <pprint.PrettyPrinter instance at 0x129425bd8>

>> pp.pprint(py.sys.path)
['',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/readline',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/Users/eflister/Library/Python/2.7/lib/python/site-packages',
 '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages']

我想出了下面这个单调乏味的方法来找到问题进口——有没有更好的方法?在

  1. 模块定义为http://www.mathworks.com/help/matlab/matlab_external/call-user-defined-custom-module.html
  2. 复制从MATLAB不会加载的库中的源文件导入
  3. 注释掉在MATLAB调用模块成功之前,怀疑导入
  4. 重命名模块并重复(一旦成功加载,MATLAB必须重新启动才能看到新的更改)

为了在sima中隔离以下有问题的导入,我只需要做了29次。:)

from PIL import Image

from skimage.measure import approximate_polygon
from skimage.measure import find_contours
from skimage.filter import threshold_otsu
from skimage import transform as tf

from sklearn.decomposition import FastICA

import scipy.io
from scipy.stats import uniform
from scipy.linalg import inv
from scipy.sparse.linalg import eigsh, eigs
from scipy.sparse.linalg import inv
from scipy import ndimage
from scipy.ndimage import measurements

import cv2

# note the following are OK:
from scipy.linalg import eig, eigh, norm
from scipy import sparse
from multiprocessing import Pool
import multiprocessing.util as util

在python中运行此代码不会显示导入异常:

lines = """
import h5py
from PIL import Image

from skimage.measure import approximate_polygon
from skimage.measure import find_contours
from skimage.filter import threshold_otsu
from skimage import transform as tf

from sklearn.decomposition import FastICA

import scipy.io
from scipy.stats import uniform
from scipy.linalg import inv
from scipy.sparse.linalg import eigsh, eigs
from scipy.sparse.linalg import inv
from scipy import ndimage
from scipy.ndimage import measurements

import cv2
"""

def tryImport(i):
    try:
        exec(i)
    except ImportError as e:
        print i
        print e
        print

map(tryImport, filter(lambda x: len(x) > 0, lines.splitlines()))

但是在MATLAB中,它给出了输出:

import h5py
cannot import name _errors

from PIL import Image
dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/_imaging.so, 2): Library not loaded: /opt/local/lib/libtiff.5.dylib
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/_imaging.so
  Reason: Incompatible library version: _imaging.so requires version 8.0.0 or later, but libtiff.5.dylib provides version 6.0.0

from skimage.measure import approximate_polygon
cannot import name _ni_support

from skimage.measure import find_contours
cannot import name _ni_support

from skimage.filter import threshold_otsu
cannot import name _ni_support

from skimage import transform as tf
cannot import name hough_ellipse

from sklearn.decomposition import FastICA
dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/_lbfgsb.so, 2): Symbol not found: __gfortran_transfer_character_write
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/_lbfgsb.so
  Expected in: /Applications/MATLAB_R2015a.app/sys/os/maci64/libgfortran.3.dylib
 in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/_lbfgsb.so

import scipy.io
cannot import name doccer

from scipy.stats import uniform
dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/special/_ufuncs.so, 2): Symbol not found: __gfortran_stop_numeric_f08
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/special/_ufuncs.so
  Expected in: /Applications/MATLAB_R2015a.app/sys/os/maci64/libgfortran.3.dylib
 in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/special/_ufuncs.so

from scipy.sparse.linalg import eigsh, eigs
dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/linalg/eigen/arpack/_arpack.so, 2): Symbol not found: __gfortran_transfer_array_write
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/linalg/eigen/arpack/_arpack.so
  Expected in: /Applications/MATLAB_R2015a.app/sys/os/maci64/libgfortran.3.dylib
 in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/linalg/eigen/arpack/_arpack.so

from scipy.sparse.linalg import inv
dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/linalg/eigen/arpack/_arpack.so, 2): Symbol not found: __gfortran_transfer_array_write
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/linalg/eigen/arpack/_arpack.so
  Expected in: /Applications/MATLAB_R2015a.app/sys/os/maci64/libgfortran.3.dylib
 in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/linalg/eigen/arpack/_arpack.so

from scipy import ndimage
cannot import name _ni_support

from scipy.ndimage import measurements
cannot import name _ni_support

import cv2
dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/cv2.so, 2): Library not loaded: /opt/local/lib/libtiff.5.dylib
  Referenced from: /opt/local/lib/libopencv_highgui.2.4.dylib
  Reason: Incompatible library version: libopencv_highgui.2.4.dylib requires version 8.0.0 or later, but libtiff.5.dylib provides version 6.0.0

我发现这个方法显示了来自matlab的错误:

>> py.importlib.import_module('sima')
Python Error: cannot import name hough_ellipse

那么从这里开始还有希望吗?在

我并不真正理解这些错误,据我所能推测,其中一些错误是:

matlab的libtiff.5.dylib提供6.0.0版本,但PIL和opencv要求>;=8.0.0

matlab的libgfortran.3.dylib不适用于scipy_lbfgsb.so.公司, _乌芬奇。所以, _阿帕克在

有什么方法可以针对MATLAB的库编译scipy/PIL/opencv?在

会非常痛苦吗?:)

我从matlab bridges找到了以下第三方python:

还有其他需要考虑的吗?在这种情况下,哪种观点/经验最有希望?我猜马特。。。在

pymex是no good

马蒂不好:

>> py_shell
py> import sima
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/__init__.py", line 6, in <module>
    from sima.imaging import ImagingDataset
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/imaging.py", line 26, in <module>
    import h5py
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/h5py/__init__.py", line 23, in <module>
    from . import _conv
  File "h5py/h5t.pxd", line 14, in init h5py._conv (/opt/local/var/macports/build/_opt_mports_dports_python_py-h5py/py27-h5py/work/h5py-2.5.0/h5py/_conv.c:6958)
  File "h5py/h5t.pyx", line 139, in init h5py.h5t (/opt/local/var/macports/build/_opt_mports_dports_python_py-h5py/py27-h5py/work/h5py-2.5.0/h5py/h5t.c:20282)
  File "h5py/h5t.pyx", line 73, in h5py.h5t.lockid (/opt/local/var/macports/build/_opt_mports_dports_python_py-h5py/py27-h5py/work/h5py-2.5.0/h5py/h5t.c:2562)
  File "h5py/h5t.pyx", line 42, in h5py.h5t.typewrap (/opt/local/var/macports/build/_opt_mports_dports_python_py-h5py/py27-h5py/work/h5py-2.5.0/h5py/h5t.c:2196)
RuntimeError: Interface initialization failed (Not a datatype object)
py> import sima
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/__init__.py", line 6, in <module>
    from sima.imaging import ImagingDataset
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/imaging.py", line 33, in <module>
    import sima.misc
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/misc/__init__.py", line 21, in <module>
    from skimage import transform as tf
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/skimage/transform/__init__.py", line 1, in <module>
    from ._hough_transform import (hough_ellipse, hough_line,
  File "skimage/transform/_hough_transform.pyx", line 13, in init skimage.transform._hough_transform (skimage/transform/_hough_transform.c:22321)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/skimage/draw/__init__.py", line 2, in <module>
    from .draw3d import ellipsoid, ellipsoid_stats
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/skimage/draw/draw3d.py", line 3, in <module>
    from scipy.special import (ellipkinc as ellip_F, ellipeinc as ellip_E)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/special/__init__.py", line 586, in <module>
    from ._ufuncs import *
ImportError: dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/special/_ufuncs.so, 2): Symbol not found: __gfortran_stop_numeric_f08
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/special/_ufuncs.so
  Expected in: /Applications/MATLAB_R2015a.app/sys/os/maci64/libgfortran.3.dylib
 in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/special/_ufuncs.so
py> import sima
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/__init__.py", line 6, in <module>
    from sima.imaging import ImagingDataset
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/imaging.py", line 33, in <module>
    import sima.misc
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/misc/__init__.py", line 21, in <module>
    from skimage import transform as tf
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/skimage/transform/__init__.py", line 1, in <module>
    from ._hough_transform import (hough_ellipse, hough_line,
ImportError: cannot import name hough_ellipse
py> import sima
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/__init__.py", line 6, in <module>
    from sima.imaging import ImagingDataset
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/imaging.py", line 33, in <module>
    import sima.misc
  File "/Users/eflister/Library/Python/2.7/lib/python/site-packages/sima/misc/__init__.py", line 21, in <module>
    from skimage import transform as tf
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/skimage/transform/__init__.py", line 1, in <module>
    from ._hough_transform import (hough_ellipse, hough_line,
ImportError: cannot import name hough_ellipse
py> import picos.tools
py> print picos.tools.available_solvers()
['cvxopt', 'mosek7']

我开始觉得虫洞到一个独立的过程听起来不错。。。在

但是,使用LD_PRELOAD来启动带有更新的libgfortran和libtiff的matlab呢?在

我想要的版本位于:

/opt/local/lib/libgcc/libgfortran.3.dylib 
/opt/local/lib/libtiff.5.dylib

在一个新的matlab会话中,以下内容没有帮助。在

>> setenv('DYLD_LIBRARY_PATH',['/opt/local/lib:' getenv('DYLD_LIBRARY_PATH')])
>> getenv('DYLD_LIBRARY_PATH')

ans =

/opt/local/lib:/Applications/MATLAB_R2015a.app/sys/os/maci64:/Applications/MATLAB_R2015a.app/bin/maci64/../../Contents/MacOS:/Applications/MATLAB_R2015a.app/bin/maci64:/Applications/MATLAB_R2015a.app/extern/lib/maci64:/Applications/MATLAB_R2015a.app/runtime/maci64:/Applications/MATLAB_R2015a.app/sys/java/jre/maci64/jre/lib/./native_threads:/Applications/MATLAB_R2015a.app/sys/java/jre/maci64/jre/lib/./server:/Applications/MATLAB_R2015a.app/sys/java/jre/maci64/jre/lib/./lib/jli

但是!!!在

~$ DYLD_INSERT_LIBRARIES=/opt/local/lib/libgcc/libgfortran.3.dylib:/opt/local/lib/libtiff.5.dylib /Applications/MATLAB_R2015a.app/bin/matlab

解决所有进口问题!!!在

>> import py.sima
Error using import
Import argument 'py.sima' cannot be found or cannot be imported.

>> import py.sima.Sequence % succeeds!
>> import py.sima.ImagingDataset % succeeds!
>> x = py.sima.ImagingDataset([1,2],'~')
Python Error: ImagingDataset objects must be initialized with a list of sequences.

>> x = py.numpy.random.random([2,3,4])

x = 

  Python ndarray with properties:

           T: [1x1 py.numpy.ndarray]
        base: [1x1 py.NoneType]
      ctypes: [1x1 py.numpy.core._internal._ctypes]
        data: [1x192 py.buffer]
       dtype: [1x1 py.numpy.dtype]
       flags: [1x1 py.numpy.flagsobj]
        flat: [1x1 py.numpy.flatiter]
        imag: [1x1 py.numpy.ndarray]
    itemsize: 8
      nbytes: 192
        ndim: 3
        real: [1x1 py.numpy.ndarray]
       shape: [1x3 py.tuple]
        size: 24
     strides: [1x3 py.tuple]

    [[[ 0.4158531   0.18912596  0.20743597  0.92631168]
      [ 0.0371785   0.48093953  0.88221637  0.85687334]
      [ 0.2267605   0.79464779  0.97438662  0.47791076]]

     [[ 0.05602249  0.06596678  0.05691491  0.02706325]
      [ 0.28477145  0.74781928  0.56700236  0.14500885]
      [ 0.87999554  0.78932748  0.24473039  0.18383564]]]

>> x = py.sima.Sequence.create('ndarray',x)
The class "py.sima.Sequence" is undefined.
Perhaps Java is not running.

>> py.sima.segment.STICA()

ans = 

  Python STICA with no properties.

    <sima.segment.stica.STICA object at 0x138e15890>

>> py.sima.segment.PlaneCA1PC()

ans = 

  Python PlaneCA1PC with no properties.

    <sima.segment.ca1pc.PlaneCA1PC object at 0x138e158d0>

我们终于如此接近了。但是为什么我不能让sima.Sequence.create()运行呢!??!在


Tags: infrompyimportlibpackageslocallibrary
2条回答

A: MATLAB有一组显式的限制,它确实支持NOTpython代码和类中的支持

虽然您的两个愿望和意愿都得到了认可,MATLAB不支持python无限制。在

MATLAB明确列出了特性,它不支持。其中之一是支持以下划线字符开头的对象名。在

很多这样的错误信息,你已经贴出来了,证实了这一事实。在

有关不支持的功能的更多信息,请访问>;Limitations to Python Support

浏览列表显示,如果您想重新设计/重新设计所有不符合这些不受支持的功能的软件包,您需要支付多大的预算。在

怎么处理这个?在

如果您确实严重依赖于这种双重世界的MATLAB/python,那么您可能会对另一种如何使事情工作的架构感兴趣。在

尝试通过ZeroMQ等集成一个进程来处理消息传递,并开始使用分布式处理,在每一侧使用本机(工作)模块。在

比在进口产品上试错快得多,那是永远飞不起来的。在

DYLD_INSERT_LIBRARIES结合使用,我们不能在MATLAB中直接接触sima.Sequence,因为它有带前导下划线的属性,正如@user3666197所指出的,MATLAB doesn't allow。在

但是我们可以调用使用sima.Sequence的python函数没有问题:

https://github.com/losonczylab/sima/issues/183#issuecomment-109097816

最后,甜蜜的成功!在

附录:
在Windows上,问题不在于libgfortran/libtiff,而在于shapely使用msvcr。在

Windows python使用msvcr90.dll,而MATLAB使用msvcr100.dll。在

在shapely中,
取代
^{
with
CDLL('C:\\Program Files\\MATLAB\\R2015a\\bin\\win64\\msvcr100.dll')
使其一切正常。
this answer似乎是一种自动确定路径的方法,适用于从何处调用shapely。在

相关问题 更多 >

    热门问题