有没有一种方法可以让python模块在我的应用程序目录中加载dll,而不是python安装时附带的版本,而不需要对python安装进行更改(这需要我做一个安装程序,注意不要通过覆盖python模块和全局更改dll版本来破坏其他应用程序...)?
具体地说,我希望python使用我的sqlite3.dll版本,而不是python附带的版本(该版本较旧,并且似乎没有fts3模块)。
发布于 2008-10-18 11:04:44
不管python和os路径设置为什么,python总是加载与pyd文件相同的目录中的dll。
因此,我需要将_sqlite3.pyd从python/v2.5/DLLS复制到我的应用程序目录中,让它加载我的新dll,而不是python附带的那个dll(因为pyd文件似乎遵循PYTHONPATH,尽管实际的dll本身并不遵循)。
发布于 2008-10-18 10:33:08
如果您正在谈论Python模块DLL,那么简单地修改sys.path就可以了。但是,如果您谈论的是与这些libfoo.dll链接的DLL,即foo.pyd所依赖的DLL,那么您需要修改PATH环境变量。我写过关于doing this for PyGTK a while ago的文章,但在您的例子中,我认为应该像这样简单:
import os
os.environ['PATH'] = 'my-app-dir' + os.pathsep + os.environ['PATH']这将在你的Windows path的开头插入my-app-dir,我相信它也控制着DLL的加载顺序。
请记住,您需要在加载有问题的DLL之前执行此操作,即在导入任何有趣的内容之前。
但是,sqlite3可能是一个特例,因为它是随Python一起分发的;很明显,快速测试它有点棘手,所以我没有专门检查sqlite3.dll。
发布于 2020-10-11 20:11:23
修改os.environ['PATH']的答案是正确的,但它不适用于我,因为我使用的是Python3.9。尽管如此,我还是收到一个错误:
ImportError:导入模块X时加载DLL失败:找不到指定的模块。
从Python3.8版本开始,他们添加了一种机制来更安全地完成这项工作。阅读有关os.add_dll_directory https://docs.python.org/3/library/os.html#os.add_dll_directory的文档
现在更安全地解决了
上使用ctype加载的扩展模块和DLL的Windows依赖项。只有系统路径、包含DLL或PYD文件的目录以及使用add_dll_directory()添加的目录才会搜索加载时依赖项。具体地说,不再使用DLL路径和当前工作目录,并且对这些内容的修改将不再对正常的解析产生任何影响。如果您的应用程序依赖于这些机制,则应检查add_dll_directory(),如果存在,则在加载库时使用它来添加DLL目录。
因此,现在这是在Python3.8和更高版本的中工作的新方法
import os
os.add_dll_directory('my-app-dir')同样,旧的方法仍然是正确的,您必须在Python3.7和更早的中使用它
import os
os.environ['PATH'] = 'my-app-dir' + os.pathsep + os.environ['PATH']之后,我的具有dll依赖关系的模块已成功加载。
https://stackoverflow.com/questions/214852
复制相似问题