Как правильно загрузить библиотеку DLL в Postgres PL / Python? - PullRequest
1 голос
/ 08 ноября 2011

Далее выдается ошибка

drop function testing();
CREATE FUNCTION testing()
 RETURNS text
AS $$
import ctypes
try:
   ctypes.windll.LoadLibrary("D:\\jcc.dll")
except:
   import traceback
   plpy.error(traceback.format_exc())
return ''
$$ LANGUAGE plpythonu;
select testing();

Сообщение об ошибке:

ERROR:  ('Traceback (most recent call last):\n  File "<string>", line 5, in __plpython_procedure_testing_1517640\n  File "D:\\Python26\\Lib\\ctypes\\__init__.py", line 431, in LoadLibrary\n    return self._dlltype(name)\n  File "D:\\Python26\\Lib\\ctypes\\__init__.py", line 353, in __init__\n    self._handle = _dlopen(self._name, mode)\nWindowsError: [Error 126] The specified module could not be found\n',)

Отлично работает в интерпретаторе Python.

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> ctypes.windll.LoadLibrary("D:\\jcc.dll")
<WinDLL 'D:\jcc.dll', handle 410000 at 1d9cb10>
>>>

1 Ответ

1 голос
/ 29 ноября 2011

«Указанный модуль не найден» - это одно из тех полезных сообщений об ошибках, которые выдает Windows. Это не всегда означает, что вы думаете, что это означает.

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

Поскольку PostgreSQL работает под собственной учетной записью пользователя, он имеет другой путь, отличный от того, в котором работает ваш интерпретатор при тестировании.Если jcc.dll зависит от (скажем) c:\jccsupportfiles\aaa.dll и c:\jccsupportfiles от вашего PATH, но не от PATH Pg-сервера, это могло бы объяснить вашу проблему.

Попробуйте использовать Dependency Walker (depen.exe)) , чтобы определить, какие библиотеки DLL требуются и где они находятся.Посмотрите, является ли это проблемой PATH.

Вместо того, чтобы возиться с PATH сервера Pg, рассмотрите возможность помещения всех библиотек DLL, необходимых для jcc.dll, в тот же каталог, что и jcc.dll.IIRC Windows всегда будет выглядеть в том же каталоге, что и модуль, который он загружает первым, при попытке загрузить модуль, от которого он зависит.

...