2008-10-18 2 views
16

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

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

ответ

6

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

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

0

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

+0

Я поместил dll в каталог моих приложений, который должен принять приоритет над файлом dir python, но модуль sqlite3 по-прежнему использует dll в каталоге python install, а не в моем. Есть ли отдельный путь dll или что-то еще? – 2008-10-18 10:24:18

+0

Вы только поместили dll в этот каталог или вы также добавили код оболочки python в это? Если нет, попробуйте последний. – 2008-10-18 10:30:06

22

Если вы говорите о библиотечных модулях Python, тогда просто изменить 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.environ['PATH'] 

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

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

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

+0

по-прежнему не загружает новую dll ... – 2008-10-18 10:59:58