无法在 Python 中导入 dll 模块
- 2025-02-08 08:52:00
- admin 原创
- 66
问题描述:
几天来我一直在努力尝试在 Windows 上编译 libuvc 的修改版本,现在我终于完成了,但我似乎无法在 Python 上加载它。我已经在 Linux 机器上使用相同版本的 Python 编译并成功导入了这个库,但它根本不喜欢 w10。
系统
WIN10 64位
Python 3.8 64 位
libusb 1.022
使用MinGW64编译的libuvc.dll
问题
当尝试
import ctypes
import ctypes.util
name = ctypes.util.find_library('libuvc')
lib = ctypes.cdll.LoadLibrary(name)
我收到以下错误:
Could not find module 'C:Program Files (x86)libuvcliblibuvc.dll'.
Try using the full path with constructor syntax.
Error: could not find libuvc!
问题是,由于 util.find_library 找到了该文件,所以它存在,但 python 认为它不在原处,或者输出只是默认的。我这里漏掉了什么?什么原因导致无法加载模块,也无法找到它?抱歉,我没有比这更多的输出。
附言:我尝试用不同的方式重新格式化字符串,但消息没有改变。
解决方案 1:
虽然晚了一年,但我已经弄清楚了发生了什么以及如何修复它。如果你看看第 340 行ctypes.CDLL
左右的代码,你会发现文档实际上是错误的。代码将构造函数定义为
def __init__(self, name, mode=DEFAULT_MODE, handle=None,
use_errno=False, use_last_error=False, winmode=None):
但是,文档中说winmode=0
。如果你看一下第 358 行,你会发现这很重要。当 时,第 374 行(别名为第110 行winmode=None
)使用的搜索模式在第 363 行设置为。此搜索模式似乎不会响应、或 的更改。_ctypes.LoadLibrary
`_dlopennt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
os.environ['PATH']sys.path
os.add_dll_directory`
winmode=0
但是,如果您通过使用而不是 来绕过该设置None
,则库似乎可以正常加载。零是完整路径的有效模式(就像 一样nt._LOAD_WITH_ALTERED_SEARCH_PATH
)。完整的模式列表可在此处找到: https: //learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexa,在dwFlags
参数下。
正如@CristiFati所指出的,Python 3.8 中的行为发生了变化。发生这种情况是因为在此之前,该winmode
参数不存在。而是mode
直接使用,默认值为ctypes.DEFAULT_MODE
,这恰好对应于零并且在所有平台上都可以工作。
用于解决差异的 Python 错误报告:https://bugs.python.org/issue42114
解决方案 2:
从Python 3.8开始,.dll搜索机制发生了变化(Win专用)。
根据[Python.Docs]: os.add_dll_directory(path)(重点是我的):
将路径添加到 DLL 搜索路径。
在解析导入的扩展模块的依赖项时(模块本身通过sys.path解析)以及ctypes时使用此搜索路径。
...
可用性: Windows。
因此,你可以这样做:
os.add_dll_directory("${path_to_working_dlls_directoy}")
其中${path_to_working_dlls_directoy}是实际路径的占位符,并且(显然)应该用它来替换。
您可以检查[SO]: PyWin32 和 Python 3.8.0 (@CristiFati 的答案)(尽管看起来非常不同,但原因相同)以了解更多详细信息。
PS:Nix OS不受影响。
更新#0
虽然我的回答是基于 (官方) 文档的,但[SO]: Can't import dll module in Python (@MadPhysicist's answer) (顺便说一句,这是一个很棒的答案) 附带了原因部分。
但是,有些方面需要澄清。
我关于os.add_dll_directory的陈述都是正确的,并且仍然适用。根据[MS.Learn]:LoadLibraryExA 函数 (libloaderapi.h)(重点是我的):
加载库搜索默认目录
0x00001000
此值是LOAD_LIBRARY_SEARCH_APPLICATION_DIR、LOAD_LIBRARY_SEARCH_SYSTEM32和LOAD_LIBRARY_SEARCH_USER_DIRS的组合 。不会搜索标准搜索路径中的目录。此值不能与LOAD_WITH_ALTERED_SEARCH_PATH组合使用。
此值表示应用程序应在其 DLL 搜索路径中包含的建议最大目录数
加载库搜索用户目录
0x00000400
如果使用此值,则使用AddDllDirectory或SetDllDirectory函数添加的目录将搜索DLL 及其依赖项。
这是默认使用的机制(winmode=None
因为LOAD_LIBRARY_SEARCH_DEFAULT_DIRS被传递给LoadLibraryEx)。
设置时winmode=0
,Win默认搜索机制启动。[MS.Learn]: 动态链接库搜索顺序 - 桌面应用程序的标准搜索顺序状态(最后一项 - 无论SafeDllSearchMode如何,重点仍然是我的):
PATH 环境变量中列出的目录。请注意,这不包括App Paths注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 App Paths 注册表项。
我准备了一个小例子。Python代码尝试(通过 CTypes)加载
位于同一目录中的dll00.dll ,而后者又链接(依赖于*)位于不同目录*(subdir00 )中的另一个 ( dll01.dll )。
dll00.c:
#include <stdio.h>
#if defined(_WIN32)
# define DLL00_EXPORT_API __declspec(dllexport)
#else
# define DLL00_EXPORT_API
#endif
int dll01Func00();
#if defined(__cplusplus)
extern "C" {
#endif
DLL00_EXPORT_API int dll00Func00();
#if defined(__cplusplus)
}
#endif
int dll00Func00() {
printf("%s - %d - %s
", __FILE__, __LINE__, __FUNCTION__);
dll01Func00();
return 0;
}
dll01.c:
#include <stdio.h>
#if defined(_WIN32)
# define DLL01_EXPORT_API __declspec(dllexport)
#else
# define DLL01_EXPORT_API
#endif
#if defined(__cplusplus)
extern "C" {
#endif
DLL01_EXPORT_API int dll01Func00();
#if defined(__cplusplus)
}
#endif
int dll01Func00() {
printf("%s - %d - %s
", __FILE__, __LINE__, __FUNCTION__);
return 0;
}
code00.py:
#!/usr/bin/env python
import argparse
import ctypes as cts
import os
import sys
DLL_NAME = "./dll00.{:s}".format("dll" if sys.platform[:3].lower() == "win" else "so")
METH_ADDLLDIR = "a"
METH_PATH = "p"
METHS = (
METH_ADDLLDIR,
METH_PATH,
)
def parse_args(*argv):
parser = argparse.ArgumentParser(description="Python .dll search path (Win) example")
parser.add_argument("--path", "-p", choices=METHS)
parser.add_argument("--winmode", "-w", type=int)
args, unk = parser.parse_known_args()
if unk:
print("Warning: Ignoring unknown arguments: {:}".format(unk))
return args.path, args.winmode
def main(*argv):
meth, wmod = parse_args()
print("PATH (original): {:}
".format(os.environ.get("PATH")))
print("Using winmode={:}".format(wmod))
if meth is not None:
subdir = os.path.join(os.path.abspath(os.path.dirname(__file__)), "subdir00")
if meth == METH_ADDLLDIR:
add_dll_directory = getattr(os, "add_dll_directory", None)
if add_dll_directory:
os.add_dll_directory(subdir)
print("Using AddDllDirectory()
")
elif meth == METH_PATH:
os.environ["PATH"] = os.pathsep.join((os.environ.get("PATH", ""), subdir))
print("Using %PATH%
")
dll00 = cts.CDLL(DLL_NAME, winmode=wmod)
print("Dll: {:}".format(dll00))
if False: # No need to actually call the function
dll00Func00 = dll00.dll00Func00
dll00Func00.argtypes = ()
dll00Func00.restype = cts.c_int
res = dll00Func00()
print("
{0:s} returned: {1:d}".format(dll00Func00.__name__, res))
if __name__ == "__main__":
print("Python {:s} {:03d}bit on {:s}
".format(" ".join(elem.strip() for elem in sys.version.split("
")),
64 if sys.maxsize > 0x100000000 else 32, sys.platform))
rc = main(*sys.argv[1:])
print("
Done.
")
sys.exit(rc)
注意:
这里有 2 个变量(可通过命令行参数改变):
+ *路径*- 如何将*subdir00*添加到*.dll*搜索路径:
1. 不执行任何操作(不添加)
2. 将其传递给*os.add_dll_directory*
3. 将其附加到*%PATH%*
+ *winmode* - 传递给*CDLL*初始化程序(仅说明*0*和*None*)结果出现了 6 种组合
输出:
[cfati@CFATI-5510-0:e:WorkDevStackOverflowq059330863]> sopr.bat ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [prompt]> "c:Installpc032MicrosoftVisualStudioCommunity9VCAuxiliaryBuildcvarsall.bat" x64 > nul [prompt]> tree /a /f Folder PATH listing for volume SSD0-WORK Volume serial number is AE9E-72AC E:. | code00.py | dll00.c | dll01.c | test.bat | ---subdir00 [prompt]> :: Build .dlls [prompt]> cl /nologo /DDLL /MD dll01.c /link /NOLOGO /DLL /OUT:subdir00dll01.dll dll01.c Creating library subdir00dll01.lib and object subdir00dll01.exp [prompt]> [prompt]> cl /nologo /DDLL /MD dll00.c /link /NOLOGO /DLL /OUT:dll00.dll subdir00dll01.lib dll00.c Creating library dll00.lib and object dll00.exp [prompt]> [prompt]> tree /a /f Folder PATH listing for volume SSD0-WORK Volume serial number is AE9E-72AC E:. | code00.py | dll00.c | dll00.dll | dll00.exp | dll00.lib | dll00.obj | dll01.c | dll01.obj | test.bat | ---subdir00 dll01.dll dll01.exp dll01.lib [prompt]> [prompt]> "e:WorkDevVEnvspy_pc064_03.10_test0Scriptspython.exe" code00.py -h Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32 usage: code00.py [-h] [--path {a,p}] [--winmode WINMODE] Python .dll search path (Win) example options: -h, --help show this help message and exit --path {a,p}, -p {a,p} --winmode WINMODE, -w WINMODE [prompt]> [prompt]> :: Going through combinations. When an argument is not passed, its default value is None [prompt]> [prompt]> "e:WorkDevVEnvspy_pc064_03.10_test0Scriptspython.exe" code00.py Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32 PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC.29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019\d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019;C:Program Files (x86)Microsoft SDKsWindows10.0AinNETFX 4
esourcesin;C:ProgramDataDockerDesktopersion-bin;C:Program Files (x86)Common FilesOracleJavajavapath;C:Program Filesdotnet;C:UserscfatiAppDataLocalProgramsPythonLauncher;e:WorkDevUtilscurrentWin;e:WorkDevVEnvspy_pc064_03.09_test0Scripts;C:Us
erscfatiAppDataLocalMicrosoftWindowsApps;C:Userscfati.dotnet ools;;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe
Using winmode=None
Traceback (most recent call last):
File "e:WorkDevStackOverflowq059330863code00.py", line 57, in <module>rc = main(*sys.argv[1:])
File "e:WorkDevStackOverflowq059330863code00.py", line 44, in main
dll00 = cts.CDLL(DLL_NAME, winmode=wmod)
File "c:Installpc064PythonPython.10libctypes__init__.py", line 374, in init
self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'e:WorkDevStackOverflowq059330863dll00.dll' (or one of its dependencies). Try using the full path with constructor syntax.
[prompt]>
[prompt]> "e:WorkDevVEnvspy_pc064_03.10_test0Scriptspython.exe" code00.py -w 0
Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC.29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019;C:Program Files (x86)Microsoft SDKsWindows10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework644.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker
esourcesin;C:ProgramDataDockerDesktopersion-bin;C:Program Files (x86)Common FilesOracleJavajavapath;C:Program Filesdotnet;C:UserscfatiAppDataLocalProgramsPythonLauncher;e:WorkDevUtilscurrentWin;e:WorkDevVEnvspy_pc064_03.09_test0Scripts;C:Us
erscfatiAppDataLocalMicrosoftWindowsApps;C:Userscfati.dotnet ools;;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe
Using winmode=0
Traceback (most recent call last):
File "e:WorkDevStackOverflowq059330863code00.py", line 57, in <module>rc = main(*sys.argv[1:])
File "e:WorkDevStackOverflowq059330863code00.py", line 44, in main
dll00 = cts.CDLL(DLL_NAME, winmode=wmod)
File "c:Installpc064PythonPython.10libctypes__init__.py", line 374, in init
self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module './dll00.dll' (or one of its dependencies). Try using the full path with constructor syntax.
[prompt]>
[prompt]>
[prompt]> "e:WorkDevVEnvspy_pc064_03.10_test0Scriptspython.exe" code00.py -p a
Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC.29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019;C:Program Files (x86)Microsoft SDKsWindows10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework644.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker
esourcesin;C:ProgramDataDockerDesktopersion-bin;C:Program Files (x86)Common FilesOracleJavajavapath;C:Program Filesdotnet;C:UserscfatiAppDataLocalProgramsPythonLauncher;e:WorkDevUtilscurrentWin;e:WorkDevVEnvspy_pc064_03.09_test0Scripts;C:Us
erscfatiAppDataLocalMicrosoftWindowsApps;C:Userscfati.dotnet ools;;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe
Using winmode=None
Using AddDllDirectory()Dll: <CDLL 'e:WorkDevStackOverflowq059330863dll00.dll', handle 7ffe6aaf0000 at 0x1f896d9ffd0>
Done.
[prompt]>
[prompt]> "e:WorkDevVEnvspy_pc064_03.10_test0Scriptspython.exe" code00.py -p a -w 0
Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC.29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019;C:Program Files (x86)Microsoft SDKsWindows10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework644.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker
esourcesin;C:ProgramDataDockerDesktopersion-bin;C:Program Files (x86)Common FilesOracleJavajavapath;C:Program Filesdotnet;C:UserscfatiAppDataLocalProgramsPythonLauncher;e:WorkDevUtilscurrentWin;e:WorkDevVEnvspy_pc064_03.09_test0Scripts;C:Us
erscfatiAppDataLocalMicrosoftWindowsApps;C:Userscfati.dotnet ools;;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe
Using winmode=0
Using AddDllDirectory()Traceback (most recent call last):
File "e:WorkDevStackOverflowq059330863code00.py", line 57, in <module>rc = main(*sys.argv[1:])
File "e:WorkDevStackOverflowq059330863code00.py", line 44, in main
dll00 = cts.CDLL(DLL_NAME, winmode=wmod)
File "c:Installpc064PythonPython.10libctypes__init__.py", line 374, in init
self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module './dll00.dll' (or one of its dependencies). Try using the full path with constructor syntax.
[prompt]>
[prompt]>
[prompt]> "e:WorkDevVEnvspy_pc064_03.10_test0Scriptspython.exe" code00.py -p p
Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC.29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019;C:Program Files (x86)Microsoft SDKsWindows10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework644.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker
esourcesin;C:ProgramDataDockerDesktopersion-bin;C:Program Files (x86)Common FilesOracleJavajavapath;C:Program Filesdotnet;C:UserscfatiAppDataLocalProgramsPythonLauncher;e:WorkDevUtilscurrentWin;e:WorkDevVEnvspy_pc064_03.09_test0Scripts;C:Us
erscfatiAppDataLocalMicrosoftWindowsApps;C:Userscfati.dotnet ools;;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe
Using winmode=None
Using %PATH%Traceback (most recent call last):
File "e:WorkDevStackOverflowq059330863code00.py", line 57, in <module>rc = main(*sys.argv[1:])
File "e:WorkDevStackOverflowq059330863code00.py", line 44, in main
dll00 = cts.CDLL(DLL_NAME, winmode=wmod)
File "c:Installpc064PythonPython.10libctypes__init__.py", line 374, in init
self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'e:WorkDevStackOverflowq059330863dll00.dll' (or one of its dependencies). Try using the full path with constructor syntax.
[prompt]>
[prompt]> "e:WorkDevVEnvspy_pc064_03.10_test0Scriptspython.exe" code00.py -p p -w 0
Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] 064bit on win32PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC.29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionToolss2019;C:Program Files (x86)Microsoft SDKsWindows10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework644.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker
esourcesin;C:ProgramDataDockerDesktopersion-bin;C:Program Files (x86)Common FilesOracleJavajavapath;C:Program Filesdotnet;C:UserscfatiAppDataLocalProgramsPythonLauncher;e:WorkDevUtilscurrentWin;e:WorkDevVEnvspy_pc064_03.09_test0Scripts;C:Us
erscfatiAppDataLocalMicrosoftWindowsApps;C:Userscfati.dotnet ools;;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe
Using winmode=0
Using %PATH%Dll: <CDLL './dll00.dll', handle 7ffe6aaf0000 at 0x142a7a73cd0>
Done.
只有 2 个组合(如预期)成功(使用subdir00):
将其传递给os.add_dll_directory(使用winmode None)
将其添加到%PATH%(使用winmode 0)
结论
还有更多方法可以添加用于搜索(依赖).dll 的目录:
os.add_dll_directory:
* 默认(推荐)选项(有第三方模块以这种方式加载*.dll*)
* *与Python*加载扩展模块(*.pyd*)依赖项的方式一致
%PATH%(并改变winmode):
* 适用于较旧 (< *v3.8* )的*Python*版本
* 似乎与*Nix*更接近- 其中路径通常添加到*${LD_LIBRARY_PATH}*(*DYLD_LIBRARY_PATH*,*LIBPATH*,*SHLIB_PATH*,...)
* 可以通过*winmode*的值进行自定义
将目录更改为.dll位置(更像是一种解决方法):
* *如果.dll*位于多个目录中则不起作用(不能同时有多个*CWD )*
相关(或多或少):
[SO]:在 Python 中加载具有依赖项的 DLL(@CristiFati 的答案)
[SO]:通过 ctypes 从 Python 调用的 C 函数返回不正确的值 (@CristiFati 的回答)
[SO]:使用命令行发现丢失的模块(“DLL 加载失败”错误)(@CristiFati 的回答)
解决方案 3:
我部分同意@MadPhysicist 的回答,但我使用的是 Python 3.9,而不是 3.8,winmode=0
错误还没有消失。但winmode=1
一切正常!
解决方案 4:
好的,我修复了它,我需要将工作目录更改为执行脚本的位置,然后从同一位置加载 dll。
os.chdir('path_to_working_dlls_directoy')
但并不完全确定这为什么有帮助。
解决方案 5:
只需“Visual C++ Redistributable Package for Visual Studio 2013”。问题就解决了。