PythonがC ++ DLLライブラリを呼び出します------ OSError:[WinError126]指定されたモジュールが見つかりません。

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

おすすめ

転載: blog.csdn.net/qq_34430371/article/details/112261682