Python ctypes:从相对路径加载DLL

问题描述 投票:0回答:5

我有一个Python模块,

wrapper.py
,它包装了一个C DLL。 DLL 与模块位于同一文件夹中。因此,我使用以下代码来加载它:

myDll = ctypes.CDLL("MyCDLL.dll")

如果我从它自己的文件夹中执行

wrapper.py
,这将起作用。但是,如果我从其他地方运行它,它就会失败。这是因为 ctypes 计算相对于当前工作目录的路径。

我的问题是,有没有办法可以指定 DLL 相对于包装器的路径而不是当前工作目录?这将使我能够将两者一起运送,并允许用户从任何地方运行/导入包装器。

python ctypes
5个回答
27
投票

您可以使用

os.path.dirname(__file__)
获取Python源文件所在目录。


14
投票

扩展马修的答案:

import os.path
dll_name = "MyCDLL.dll"
dllabspath = os.path.dirname(os.path.abspath(__file__)) + os.path.sep + dll_name
myDll = ctypes.CDLL(dllabspath)

这只适用于脚本,而不是控制台或

py2exe


12
投票

我总是将 DLL 所在的目录添加到路径中。有效:

os.environ['PATH'] = os.path.dirname(__file__) + ';' + os.environ['PATH']
windll.LoadLibrary('mydll.dll')

请注意,如果您使用 py2exe,则此操作不起作用(因为未设置

__file__
)。在这种情况下,您需要依赖
sys.executable
属性(完整说明位于 http://www.py2exe.org/index.cgi/WhereAmI


0
投票

另一个版本:

dll_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'MyCDLL.dll')
myDll = ctypes.CDLL(dll_file)

0
投票

如果您使用的是

__init__.py
文件,则该 python 文件包含的文件夹对于编译器来说是众所周知的。您可以使用该文件夹名称作为相对路径。例如,如果我有一个名为
foo
的文件夹,并且它包含一个
__init__.py
文件,那么这个
foo
文件夹可以用作基本文件夹。假设我在 foo 中有一个
helper.dll
,我可以像这样打开 dll。

helper = ctypes.WinDLL(r"foo\helper.dll")

这会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.