Независимое от пути управление общими библиотеками C в пакете Python - PullRequest
3 голосов
/ 31 мая 2011

Скажем, у меня есть пакет с именем Foo, организованный следующим образом:

Foo\
    __init__.py
    foo.py
    bar.py
    lib\
        libwhatever.so

Мой модуль foo.py использует python ctypes, чтобы обернуть C-методы, содержащиеся в моем libwhever.lib, что включает проверку lib:где это должно быть.2 вопроса:

1) Как проверить в моем пакете, что необходимая библиотека находится на своем месте (в Foo \ lib), где бы ни был размещен весь пакет Foo?

Прямо сейчас,путь к моей библиотеке жестко запрограммирован, но, как я расскажу позже, проблема возникнет.

2) Затем у меня есть модуль bar.py, который упаковывает более медленную версию C-подпрограмм на Python внутриlibwhatever.Я хотел бы использовать их, если импорт libwh независимо от того, что не удается.Есть ли способ абстрактного переключения между версиями подпрограмм на C и Python в случае успеха или неудачи импорта библиотеки?

Заранее благодарим вас за совет.

1 Ответ

1 голос
/ 31 мая 2011

Если вы работаете в Linux, я думаю вам придется либо добавить этот .so-файл в путь поиска вашей библиотеки, либо добавить каталог модуля в свой путь.Посмотрите на ldconfig.man ldconfig.Как только вы сделаете любой из них, вы можете использовать ctypes.util.find_library().В противном случае вам понадобится полный путь к файлу .so, чтобы использовать cdll().

. Я думаю, что я бы сделал, просто построил этот путь во время выполнения - так что-то вроде этого:

from ctypes import CDLL
import Foo
try:
    MyLib = CDLL(Foo.__path__[0] + '/lib/libwhatever.so')
except OSError:
    from Foo import bar as MyLib

Хотя, может быть, есть лучший способ ...

...