Python ctypes:从相对路径加载DLL

31 投票
5 回答
50107 浏览
提问于 2025-04-15 23:35

我有一个Python模块,叫做wrapper.py,它用来包装一个C语言写的DLL文件。这个DLL文件和模块在同一个文件夹里。所以,我用下面的代码来加载它:

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

这样做是没问题的,如果我是在它自己的文件夹里执行wrapper.py。但是,如果我在其他地方运行它,就会出错。这是因为ctypes会根据当前的工作目录来计算路径。

我的问题是,有没有办法让我指定DLL的路径相对于这个包装器,而不是相对于当前的工作目录?这样我就可以把这两个文件一起打包,让用户可以从任何地方运行或导入这个包装器。

5 个回答

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

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 的时候使用。

28

你可以使用 os.path.dirname(__file__) 这个代码来获取你正在写的Python文件所在的文件夹路径。

撰写回答