我在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
,但这并没有改变任何内容。
答案 0 :(得分:0)
我们想要使用matlab的msvcr,而不是隐藏它。在形状上,取代
CDLL(find_library('c'))
CDLL('C:\\Program Files\\MATLAB\\R2015a\\bin\\win64\\msvcr100.dll')
使vi
完成所有工作。 this answer似乎是一种自动确定路径的方法,适用于从中调整形状的任何位置。