DLL-модули python

Есть ли способ сделать модуль python загружать dll в каталог приложения, а не версию, поставляемую с установкой python, без внесения изменений в установку python (для чего мне потребовалось бы сделать установщик и быть осторожным Я не нарушал другие приложения для людей, перезаписывая модули python и меняя версии dll globaly...)?

В частности, я хотел бы, чтобы python использовал мою версию sqlite3.dll, а не версию, поставляемую с python (которая старше и не имеет модуля fts3).

Ответы

Ответ 1

Хорошо, что python всегда загружает dll в тот же каталог, что и файл pyd, независимо от того, для чего установлены пути python и os.

Так что мне нужно было скопировать файл _sqlite3.pyd из python/v2.5/DLLS в каталог моих приложений, где находится новый sqlite3.dll, заставляя его загружать мою новую dll, а не ту, которая поставляется с python (поскольку pyd файлы, похоже, следуют за PYTHONPATH, даже если сами actaul dll не работают).

Ответ 2

Если вы говорите о библиотечных DLL-модулях Python, то просто изменить sys.path должно быть хорошо. Однако, если вы говорите о DLL, связанных с этими DLL; то есть a libfoo.dll, из которых a foo.pyd зависит, тогда вам нужно изменить свою переменную среды PATH. Я писал о для этого для PyGTK некоторое время назад, но в вашем случае я думаю, что это должно быть так просто:

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

Это будет вставлять my-app-dir во главе вашего пути Windows, который, я считаю, также контролирует загрузку для DLL.

Имейте в виду, что вам нужно будет сделать это перед загрузкой соответствующей DLL, то есть перед импортом чего-нибудь интересного.

sqlite3 может быть немного особенным, хотя, поскольку он распространяется с Python; это, очевидно, довольно сложно проверить это быстро, поэтому я специально не проверил sqlite3.dll.

Ответ 3

Если ваша версия sqlite находится в sys.path до версии системы, она будет использовать это. Таким образом, вы можете либо поместить его в текущий каталог, либо изменить переменную среды PYTHONPATH, чтобы сделать это.