我在 Windows 7/64 上。shapely 没有在他们的pypi 页面上提供 Windows 安装程序,即使他们最近似乎 有。他们的 pypi 页面和他们的README说要使用chris gohlke 的非官方二进制文件。我不清楚原因——像pypi这样的东西不能安装dll,所以如果你的代码依赖于dll,你必须手动制作安装程序,但是制作安装程序很痛苦,因为你需要ms visual studio或某物?
无论如何,gohlke 的二进制文件在 winpython(2.7)中对我来说很好,但当我尝试使用 matlab 的新python 桥导入时却不行。shapely 是 windows 上唯一在 matlab 中给我带来麻烦的 python 库——我可以使用 openCV、numpy、scipy、scikit's、mosek、picos、PIL、future,一切都很好。它也是我需要 gohlke 安装程序的唯一库。所以我认为有联系。
当我py.importlib.import_module('shapely')
在matlab中时,我得到了这个:
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,如果构建 .dll,则使用资源 ID 2。有关详细信息,请参阅如何:
这似乎与 chris gohlke 的评论有关。
这是我尝试过的更多事情。
在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']
在蟒蛇中:
>>> 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
只是shapely
在我的 python 中显示的目录site-packages
。
其他几个 SO 答案表明它是 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()
触发错误弹出> 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
但这并没有改变任何东西。