如何在Windows上安装塑造,以便可以从matlab导入?

时间:2015-06-10 21:49:16

标签: matlab manifest ctypes shapely geos

我在Windows 7/64上。即使他们pypi page seem to,他们have recently上也不提供Windows安装程序。他们的pypi页面,他们的README说使用chris gohlke's unofficial binaries。我不清楚原因 - 像pypi这样的东西无法安装dll,所以如果你的代码依赖于dll,你必须手工制作安装程序,但是因为你需要ms visual studio或者安装程序很痛苦什么?

无论如何,gohlke的二进制文件在winpython(2.7)中对我来说很好,但是当我尝试使用matlab的新python bridge导入时却没有。 shapely是Windows上唯一一个在matlab中给我带来麻烦的python库 - 我可以使用openCV,numpy,scipy,scikit,mosek,picos,PIL,future,一切都很好。它也是我需要gohlke安装程序的唯一库。所以我觉得有联系。

当我在matlab中py.importlib.import_module('shapely')时,我明白了:

PyException with properties:

ExceptionObject: [1x3 py.tuple]
     identifier: 'MATLAB:Python:PyException'
        message: 'Python Error: [Error 1114] A dynamic link library (DLL) initialization routine failed'
          cause: {}
          stack: [1x1 struct]

弹出窗口也出现了:

Microsoft Visual C++ Runtime Library
R6034 "an application has made an attempt to load the c runtime library incorrectly"
谷歌搜索这个,我明白了 https://msdn.microsoft.com/en-us/library/ms235560(v=vs.90).aspx

  

Visual Studio 2008.应用程序尝试加载C   不使用清单的运行时库。这是一种不受支持的方式   加载Visual C ++ DLL。您需要修改要构建的应用程序   带有清单。   应用程序必须使用清单来加载C运行时库。对于   有关详细信息,请参阅并排共享Visual C ++库   Visual Studio中的程序集和清单生成。 ... 纠正   此错误重建您的应用程序以包含清单。建立一个   Visual Studio的应用程序自动将清单放入   生成的.exe或.dll文件。如果你正在建立命令   行,使用mt.exe工具将清单添加为资源。使用   如果构建.exe,则为资源ID 1;如果构建.exe,则为资源ID 2   .dll文件。有关更多信息,请参见如何:在一个内部嵌入清单   C / C ++应用程序。“

这似乎与chris gohlke的comment here有关。

这里有一些我尝试过的东西。

在matlab中:

>> x=py.ctypes.util.find_library('geos_c')

x =

  Python NoneType with no properties.

    None

但在python中也一样!

>>> from ctypes.util import find_library
>>> print find_library('geos_c')
None

但是,我可以使用python中的形状:

>>> from shapely.geometry import MultiPolygon, Polygon, Point
>>> Point()
<shapely.geometry.point.Point object at 0x000000000399F2E8>

在matlab中:

>> x=py.ctypes.CDLL('C:\Users\nlab\Downloads\WinPython-64bit-2.7.9.5\python-2.7.9.amd64\Lib\site-packages\shapely\DLLs\geos_c.dll')

x =

  Python CDLL with no properties.

    <CDLL 'C:\Users\nlab\Downloads\WinPython-64bit-2.7.9.5\python-2.7.9.amd64\Lib\site-packages\shapely\DLLs\geos_c.dll',
handle e3f60000 at 7078b588>

>> x.GEOSversion()
No appropriate method, property, or field 'GEOSversion' for class
'py.ctypes.CDLL'.

>> x.initGEOS()
No appropriate method, property, or field 'initGEOS' for class 'py.ctypes.CDLL'.

>> x=py.ctypes.CDLL('C:\Users\nlab\Downloads\WinPython-64bit-2.7.9.5\python-2.7.9.amd64\Lib\site-packages\shapely\DLLs\geos_c.dll').GEOSversion()
No appropriate method, property, or field 'GEOSversion' for class
'py.ctypes.CDLL'.

Error: Unexpected MATLAB expression.

>> x=py.ctypes.CDLL('C:\Users\nlab\Downloads\WinPython-64bit-2.7.9.5\python-2.7.9.amd64\Lib\site-packages\shapely\DLLs\geos_c.dll').initGEOS()
No appropriate method, property, or field 'initGEOS' for class 'py.ctypes.CDLL'.

Error: Unexpected MATLAB expression.

>> py.dir(x)

ans =

  Python list with no properties.

    ['_FuncPtr', '__class__', '__delattr__', '__dict__', '__doc__',
'__format__', '__getattr__', '__getattribute__', '__getitem__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_',
'_handle', '_name']

在python中:

>>> from ctypes import CDLL
>>> x=CDLL("C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.am
d64\\Lib\\site-packages\\shapely\\DLLs\\geos_c.dll")
>>> print x
<CDLL 'C:\Users\nlab\Downloads\WinPython-64bit-2.7.9.5\python-2.7.9.amd64\Lib\si
te-packages\shapely\DLLs\geos_c.dll', handle e3f60000 at 2292cc0>
>>> x.GEOSversion()
-469489536
>>> x.initGEOS()
36606784
>>> dir(x)
['GEOSversion', '_FuncPtr', '__class__', '__delattr__', '__dict__', '__doc__', '
__format__', '__getattr__', '__getattribute__', '__getitem__', '__hash__', '__in
it__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__se
tattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_fla
gs_', '_func_restype_', '_handle', '_name', 'initGEOS']

搜索geos_c.dll只显示我的python shapely中的site-packages目录。

couple other SO answers建议将matlab的不兼容副本msvcr * .dll放在路径的某处,并且可疑:

>> py.pprint.PrettyPrinter().pprint(py.sys.path)
['',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\python27.zip',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\DLLs',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\plat-win',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\lib-tk',
 'C:\\Program Files\\MATLAB\\R2015a\\bin\\win64',
 'C:\\Users\\nlab\\AppData\\Roaming\\Python\\Python27\\site-packages',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\FontTools',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\win32',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\win32\\lib',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\Pythonwin']

这样:

>> import py.sys.path
>> path.remove('C:\Program Files\MATLAB\R2015a\bin\win64')
>> py.pprint.PrettyPrinter().pprint(py.sys.path)
['',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\python27.zip',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\DLLs',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\plat-win',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\lib-tk',
 'C:\\Users\\nlab\\AppData\\Roaming\\Python\\Python27\\site-packages',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\FontTools',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\win32',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\win32\\lib',
 'C:\\Users\\nlab\\Downloads\\WinPython-64bit-2.7.9.5\\python-2.7.9.amd64\\lib\\site-packages\\Pythonwin']
>> py.importlib.import_module('shapely')

ans = 

  Python module with properties:

                 ftools: [1x1 py.module]
    ctypes_declarations: [1x1 py.module]

    <module 'shapely' from 'C:\Users\nlab\Downloads\WinPython-64bit-2.7.9.5\python-2.7.9.amd64\lib\site-packages\shapely\__init__.pyc'>

耶!但是一旦我尝试使用它,我就会得到完全相同的R6034错误弹出窗口

>> py.shapely.geometry.Point()

触发错误弹出&gt; 10次​​!

以下只做一次:

>> py.importlib.import_module('shapely.geometry')
Python Error: [Error 1114] A dynamic link library (DLL) initialization routine failed

我还从...\AppData\Roaming\Python\Python27\site-packages删除了sys.path,但这并没有改变任何内容。

1 个答案:

答案 0 :(得分:0)

我们想要使用matlab的msvcr,而不是隐藏它。在形状上,取代 CDLL(find_library('c')) CDLL('C:\\Program Files\\MATLAB\\R2015a\\bin\\win64\\msvcr100.dll')使vi完成所有工作。 this answer似乎是一种自动确定路径的方法,适用于从中调整形状的任何位置。