无法在 Python 中导入 dll 模块

2025-02-08 08:52:00
admin
原创
66
摘要:问题描述:几天来我一直在努力尝试在 Windows 上编译 libuvc 的修改版本,现在我终于完成了,但我似乎无法在 Python 上加载它。我已经在 Linux 机器上使用相同版本的 Python 编译并成功导入了这个库,但它根本不喜欢 w10。系统WIN10 64位Python 3.8 64 位libu...

问题描述:

几天来我一直在努力尝试在 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_DIRSos.environ['PATH']sys.pathos.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 的答案)(尽管看起来非常不同,但原因相同)以了解更多详细信息。

PSNix 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_DIRLOAD_LIBRARY_SEARCH_SYSTEM32LOAD_LIBRARY_SEARCH_USER_DIRS的组合 。不会搜索标准搜索路径中的目录。此值不能与LOAD_WITH_ALTERED_SEARCH_PATH组合使用。
此值表示应用程序应在其 DLL 搜索路径中包含的建议最大目录数

  • 加载库搜索用户目录

0x00000400

如果使用此值,则使用AddDllDirectorySetDllDirectory函数添加的目录将搜索DLL 及其依赖项。

这是默认使用的机制(winmode=None因为LOAD_LIBRARY_SEARCH_DEFAULT_DIRS被传递给LoadLibraryEx)。

设置时winmode=0Win默认搜索机制启动。[MS.Learn]: 动态链接库搜索顺序 - 桌面应用程序的标准搜索顺序状态(最后一项 - 无论SafeDllSearchMode如何,重点仍然是我的):

  1. 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:Installpc032MicrosoftVisualStudioCommunity9VCAuxiliaryBuildcvarsall.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:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC.29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team 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:ProgramDataDockerDesktop ersion-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:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe

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 win32

PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC .29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019;C:Program Files (x86)Microsoft SDKsWindows 10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework64 4.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell 1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker

esourcesin;C:ProgramDataDockerDesktop ersion-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:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe

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 win32

PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC .29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019;C:Program Files (x86)Microsoft SDKsWindows 10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework64 4.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell 1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker

esourcesin;C:ProgramDataDockerDesktop ersion-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:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe

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 win32

PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC .29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019;C:Program Files (x86)Microsoft SDKsWindows 10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework64 4.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell 1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker

esourcesin;C:ProgramDataDockerDesktop ersion-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:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe

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 win32

PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC .29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019;C:Program Files (x86)Microsoft SDKsWindows 10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework64 4.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell 1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker

esourcesin;C:ProgramDataDockerDesktop ersion-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:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe

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 win32

PATH (original): c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE\ExtensionsMicrosoftIntelliCodeCLI;c:Installpc032MicrosoftVisualStudioCommunity9VCToolsMSVC .29.30133inHostX64x64;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCVCPackages;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTestWindow;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;c:Installpc032MicrosoftVisualStudioCommunity9MSBuildCurrentinRoslyn;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Toolsx64;c:Installpc032MicrosoftVisualStudioCommunity9Team ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019d;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools s2019;C:Program Files (x86)Microsoft SDKsWindows 10.0AinNETFX 4
.8 Toolsx64;C:Program Files (x86)HTML Help Workshop;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftFSharpTools;c:Installpc032MicrosoftVisualStudioCommunity9Common7Toolsdevinit;C:Program Files (x86)Windows Kitsin.0.22000.0x64;C:Program Files (x86)Windows Kitsinx64;c:Installpc032MicrosoftVisualStudioCommunity9\MSBuildCurrentBin;C:WINDOWSMicrosoft.NETFramework64 4.0.30319;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDE;c:Installpc032MicrosoftVisualStudioCommunity9Common7Tools;C:WINDOWSSystem32WindowsPowerShell 1.0;C:WINDOWSSystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:Installpc064DockerDockerVersionDocker

esourcesin;C:ProgramDataDockerDesktop ersion-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:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeCMakein;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDECommonExtensionsMicrosoftCMakeNinja;c:Installpc032MicrosoftVisualStudioCommunity9Common7IDEVCLinuxinConnectionManagerExe

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 的目录

  1. os.add_dll_directory

* 默认(推荐)选项(有第三方模块以这种方式加载*.dll*)
* *与Python*加载扩展模块(*.pyd*)依赖项的方式一致
  1. %PATH%(并改变winmode):

* 适用于较旧 (< *v3.8* )的*Python*版本
* 似乎与*Nix*更接近- 其中路径通常添加到*${LD_LIBRARY_PATH}*(*DYLD_LIBRARY_PATH*,*LIBPATH*,*SHLIB_PATH*,...)
* 可以通过*winmode*的值进行自定义
  1. 将目录更改.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”​​。问题就解决了。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用