PythonはC ++ DLLライブラリを呼び出します
指定されたモジュールが見つからない というPythonのOSError:[WinError126]の問題を解決します。
1.質問:
Python開発の過程で、(効率を向上させるために)C ++ DLLライブラリを呼び出す状況が発生する可能性が非常に高いため、ctypesパッケージを使用して呼び出す必要があります。
- ctypes.cdll.LoadLibrary(“ path”)または
- ctypes.CDLL( "path")、
次に、次の問題が発生する可能性があります。一般的な意味は、指定されたライブラリファイルが見つからないことですが、このパスは次のようになります。
Traceback (most recent call last):
File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module>
LoadDll()
File "E:/WorkSpace/BT/DemoProject/main.py", line 13, in LoadDll
lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll")
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 364, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] 找不到指定的模块。
第二に、私が試した解決策
- パスを作成するときに、一重引用符、二重引用符、スラッシュ、円記号を試しましたが、いずれも原因ではありませんでした。
- pythonインストールパッケージがないのではないかと疑われたので、ctypesライブラリをインストールしましたが、たくさんインストールしても問題は解決しませんでした。
3.オンラインソリューション:
- 少し問題があると言われています。Pythonは64ビット、生成されたDLLライブラリファイルは32ビットで、一致しません。
- それはエンコーディングの問題だと言った、それはANSIとUnicodeの間の混乱です。
- 呼び出しメソッドに問題があるとも言われています。問題の原因となるstdcallとcdeclの2つのメソッドがあります。
- 現在のdllライブラリパスを追加してみてください:os.chdir( "E:\ WorkSpace \ BT \ tool \ Download \ res")
- DLLが他のライブラリファイルに依存している可能性があり、他のライブラリファイルを現在のディレクトリに追加する必要があります。(依存するdllライブラリのオンライン検索を見つける方法)
第四に、最終的な解決策:
-
Dllライブラリの依存関係の問題については、使用するDLLライブラリが依存している他のライブラリファイルを見つけて、プロジェクトディレクトリに配置する必要があります。
-
DLLライブラリファイルを配置するためにプロジェクトディレクトリにもファイルを作成する場合は、次の関数を使用してフォルダパスを追加する必要があります:os.chdir( "E:\ WorkSpace \ BT \ tool \ Download \ res")
-
ライブラリファイルが依存している他のDLLライブラリファイルを探します。DependencyWalkerを使用することをお勧めします。使用しているライブラリが依存している他のライブラリファイルを見つけてから、Windows / system32に移動して依存している他のライブラリファイルを見つけます。オン。
アドレスをダウンロードするか、作者のメールアドレスに連絡してください
-
数字が一致しない場合、報告されるエラーは126ではなく193です。この場合、x64を再利用して、 64ビットライブラリファイルを再コンパイルして生成します。
Traceback (most recent call last):
File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module>
LoadDll()
File "E:/WorkSpace/BT/DemoProject/main.py", line 13, in LoadDll
lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll")
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 364, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
- 関数呼び出しの問題(stdcallおよびcdecl)がある場合、モジュールが見つからないということではありませんが、対応する関数は見つかりません。C++のオーバーロードおよびCはオーバーロードをサポートしておらず、extern "C"がここで使用されます。詳細については、作者によるこの記事を参照してください。この場合、dllライブラリの関数名宣言にextern "C"の変更を追加する必要があります。
静的ライブラリ(lib)と動的ライブラリ(DLL)-関数のオーバーロードの理解
私がデバッグしているときに、作者はそれを試し、この状況を見つけました。
DLLライブラリプログラム:直接コンパイルしてDLLライブラリを作成します。
#ifndef PCH_H
#define PCH_H
#include "framework.h"
#include "iostream"
#define LIB_API __declspec(dllexport)
LIB_API void HelloWorld();
LIB_API int Sub(int a, int b);
#endif
#include "pch.h"
using namespace std;
LIB_API void HelloWorld()
{
cout << "HelloWorld" << endl;
}
LIB_API int Sub(int a, int b)
{
return ((a)-(b));
}
Python呼び出しプログラム:
def LoadDll():
lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll")
lib.HelloWorld()
lib.Sub.argtypes = (c_int,c_int)
lib.Sub.restype = c_int
print(lib.Sub(3,1))
return lib.Sub(3,1)
エラー:
Traceback (most recent call last):
File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module>
LoadDll()
File "E:/WorkSpace/BT/DemoProject/main.py", line 14, in LoadDll
lib.HelloWorld()
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 377, in __getattr__
func = self.__getitem__(name)
File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 382, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'HelloWorld' not found