python模块dlls

时间:2008-10-18 10:17:58

标签: python module

有没有办法让python模块在我的应用程序目录中加载一个dll而不是python安装附带的版本,而不更改python安装(这需要我做一个安装程序,并且要小心我没有通过覆盖python模块和更改dll版本全球范围来破坏其他人的应用程序......)?

具体来说,我希望python使用我的sqlite3.dll版本,而不是python附带的版本(更老版本,似乎没有fts3模块)。

5 个答案:

答案 0 :(得分:25)

如果您正在谈论Python模块DLL,那么只需修改sys.path即可。但是,如果您正在讨论针对这些DLL的链接的DLL;即libfoo.dll所依赖的foo.pyd,则需要修改PATH环境变量。我写了关于doing this for PyGTK a while ago的文章,但在你的情况下,我认为它应该简单:

import os
os.environ['PATH'] = 'my-app-dir' + os.pathsep + os.environ['PATH']

这将在您的Windows路径的头部插入my-app-dir,我相信它也控制了DLL的加载顺序。

请记住,在加载有问题的DLL之前,即在导入任何有趣的内容之前,您需要执行此操作。

但是,sqlite3可能有点特殊,因为它是用Python发布的;快速测试这显然有点棘手,所以我没有特别检查sqlite3.dll

答案 1 :(得分:6)

好吧,不管python和os路径设置为什么,python总是将pll加载到与pyd文件相同的目录中。

所以我需要将_sqlite3.pyd从python / v2.5 / DLLS复制到新的sqlite3.dll的app目录,使其加载我的新dll,而不是python附带的那个(因为pyd文件似乎遵循PYTHONPATH,即使actaul dlls自己也不这样做。

答案 2 :(得分:1)

修改os.environ['PATH']的答案是正确的,但它对我不起作用,因为我使用的是python 3.9。 仍然出现错误:

ImportError:导入模块X时,DLL加载失败:指定 找不到模块。

从python 3.8版本开始,他们添加了一种机制来更安全地执行此操作。 阅读有关os.add_dll_directory https://docs.python.org/3/library/os.html#os.add_dll_directory

的文档

具体参见python 3.8 what's new

现在可以更安全地解决Windows上扩展模块的DLL依赖关系以及随ctypes加载的DLL的依赖关系。仅搜索系统路径,包含DLL或PYD文件的目录以及使用add_dll_directory()添加的目录以查找加载时间相关性。具体来说, PATH和当前的工作目录将不再使用,对其的修改将不再对正常的DLL解析产生任何影响。如果您的应用程序依赖于这些机制,则应检查add_dll_directory(),如果存在,请在加载库时使用它来添加DLL目录。

所以现在这是使其在 python 3.8和更高版本中工作的新方法:

import os
os.add_dll_directory('my-app-dir')

同样,旧方法仍然正确,您将不得不在 python 3.7和更早版本中使用它:

import os
os.environ['PATH'] = 'my-app-dir' + os.pathsep + os.environ['PATH']

之后,我具有dll依赖项的模块已成功加载。

答案 3 :(得分:0)

如果您的sqlite版本在系统版本之前的sys.path 中,它将使用它。因此,您可以将其放在当前目录中,也可以更改PYTHONPATH环境变量来执行此操作。

答案 4 :(得分:0)

我遇到了同样的问题,因为默认 python 库的管理权限在企业环境中被阻止,并且执行安装非常麻烦。

什么对我有用:

  1. 在新位置复制 sqlite3 库
  2. 将最新的 sqlite3.dll(您从 sqlite3 web 中想要的版本)和旧的 _sqlite3.pyd 放入新位置或新的 sqlite3 库中。旧的 _sqlite3.pyd 可以在默认的 python 库 lib/DLLs 文件夹中找到。
  3. 进入新的sqlite3库,修改dbapi2.py如下: 将“from _sqlite3 import *”改为“from sqlite3._sqlite3 import *”
  4. 确保 python 首先加载这个新的 sqlite3 库。如果需要,请添加此库的路径。