0

私はWindows 7/64を使用しています。shapely はpypi ページでWindows インストーラーを提供していませんが、最近は提供しているようです 。彼らの pypi ページとREADMEには、 chris gohlke の非公式バイナリを使用するように書かれています。理由はわかりません-pypiのようなものはdllをインストールできないため、コードがdllに依存している場合は手動でインストーラーを作成する必要がありますが、ms Visual Studioまたはなにか?

とにかく、gohlke のバイナリは winpython (2.7) でうまく動作しますが、matlab の新しいpython bridgeを使用してインポートしようとするとうまくいきません。shapely は、matlab でこの問題を引き起こしている Windows 上の唯一の Python ライブラリです。openCV、numpy、scipy、scikit、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 のコメント hereに関連しているようです。

ここに私が試したいくつかのことがあります。

マトラブで:

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

マトラブで:

>> 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.dllshapely私のpythonのsite-packages.

他のいくつかの SOの回答は、それが互換性のないmsvcr * .dllのコピーをパスのどこかに置くmatlabであり、疑わしいことを示唆しています:

>> 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たが、何も変わりませんでした。

4

1 に答える 1

0

非表示にするのではなく、matlab の msvcr を使用します。形を整えて、に置き換える CDLL(find_library('c'))CDLL('C:\\Program Files\\MATLAB\\R2015a\\bin\\win64\\msvcr100.dll')、すべてが機能します。 この答えは、そのパスを自動的に決定する方法のようで、どこからでも適切に呼び出すのに適しています。

于 2015-06-11T08:34:18.733 に答える