как установить shapely на окна, чтобы его можно было импортировать из Matlab?

у меня виндовс 7/64. shapely не предлагает установщики Windows на своей странице pypi, хотя они кажется недавно. их страница pypi и их README говорят использовать неофициальные двоичные файлы Криса Гольке. мне не ясна причина - что-то вроде pypi не может установить dll, поэтому вам нужно сделать установщик вручную, если ваш код зависит от dll, но создание установщика - это боль, потому что вам нужна MS Visual Studio или что-нибудь?

в любом случае, двоичный файл Gohlke отлично работает для меня в winpython (2.7), но не когда я пытаюсь импортировать с помощью нового мост Python. shapely - единственная библиотека Python для Windows, которая доставляет мне эту проблему в Matlab - я могу использовать 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 без использования манифеста. Это неподдерживаемый способ загрузки библиотек DLL Visual C++. Вам нужно изменить приложение для сборки с помощью манифеста. Приложения должны использовать манифест для загрузки библиотеки времени выполнения C. Дополнительные сведения см. в статьях Библиотеки Visual C++ как общие параллельные сборки и создание манифеста в Visual Studio. ... Чтобы исправить эту ошибку Перестройте приложение, чтобы оно включало манифест. Создание приложения с помощью Visual Studio автоматически помещает манифест в полученный файл .exe или .dll. Если вы выполняете сборку из командной строки, используйте инструмент mt.exe, чтобы добавить манифест в качестве ресурса. Используйте идентификатор ресурса 1, если вы создаете .exe, и идентификатор ресурса 2, если вы создаете .dll. Дополнительные сведения см. в разделе Практическое руководство. Внедрение манифеста в приложение C/C++».

это, кажется, связано с прокомментируйте здесь.

вот еще несколько вещей, которые я пробовал.

в матлабе:

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

x =

  Python NoneType with no properties.

    None

но то же самое в питоне!

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

однако я могу использовать shapely из python:

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

в матлабе:

>> 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.

a пара других ответы 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']

so:

>> 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, но это ничего не изменило.


person user1441998    schedule 10.06.2015    source источник


Ответы (1)


мы хотим использовать msvcr от Matlab, а не скрывать его. в форме замена CDLL(find_library('c')) на CDLL('C:\\Program Files\\MATLAB\\R2015a\\bin\\win64\\msvcr100.dll') заставляет все это работать. этот ответ кажется метод, который автоматически определяет этот путь, подходящий для того места, откуда вы вызываете shapely.

person user1441998    schedule 11.06.2015