Скомпилируйте и используйте python-openzwave с open-zwave в нестандартном месте

Я вручную скомпилировал python-openzwave для работы с библиотекой C++.

Я хотел бы использовать его как аддон Kodi (OpenELEC работает на Pi 3), поэтому не могу использовать стандартную установку. Я скомпилировал все, скачал пропавший six а также louie libs, а теперь попробуй запустить hello_world.py,

Моя текущая структура dirs следующая:

- root
  - bin
      - .lib
      - config
        Alarm.o
        ...
        libopenzwave.a
        libopenzwave.so
        libopenzwave.so.1.4
        ...
  - libopenzwave
      driver.pxd
      group.pxd
      ...
  - louie
      __init__.py
      dispatcher.py
      ...
  - openzwave
      __init__.py
      command.py
      ...
  six.py
  hello_world.py

Но когда я запускаю hello_world.py, я получаю следующую ошибку:

Traceback (most recent call last):
  File "hello_world.py", line 40, in <module> 
    from openzwave.controller import ZWaveController 
  File "/storage/.kodi/addons/service.multimedia.open-zwave/openzwave/controller.py", line 34, in <module> 
    from libopenzwave import PyStatDriver, PyControllerState 
ImportError: No module named libopenzwave

Если я перееду libopenzwave.a а также libopenzwave.so в корневую папку, то я получаю следующую ошибку:

Traceback (most recent call last):
  File "hello_world.py", line 40, in <module> 
    from openzwave.controller import ZWaveController 
  File "/storage/.kodi/addons/service.multimedia.open-zwave/openzwave/controller.py", line 34, in <module> 
    from libopenzwave import PyStatDriver, PyControllerState 
ImportError: dynamic module does not define init function (initlibopenzwave)

Что не так с моей настройкой?

2 ответа

Решение

Как правило, необходимые шаги состоят из звонков make build который обрабатывает строительство .cpp файлы для openzwave и загрузки всех зависимостей (включая Cython); а также make install который управляет setup-api, setup-lib.py (этот сценарий установки также создает C++ Расширение Python для openzwave), setup-web.py а также setup-manager.py,

Так как вы не можете бежать make install как вы указали, и вместо этого используете предоставляемый ими архив, единственные другие варианты создания расширения Python после сборки библиотеки openzwave с make buildпорождает .so файлы для него без установки в стандартные места.

Строительство .so для расширения Cython в той же папке, что и Cython Сценарии выполняются с помощью:

python setup.py build_ext --inplace

Это должно создать общую библиотеку в src-lib названный libopenzwave.so (это отличается от libopenzwave.so содержится в bin/ каталог), который содержит все функции, указанные в модуле расширения. Вы можете попробовать добавить это к libopenzwave папка.

Если вы передадите специальные флаги компилятора во время make build для создания библиотеки openzwave вы должны указать те же самые при выполнении setup-lib.py скрипт. Это можно сделать, указав CFLAGS перед его выполнением (как указано здесь), иначе у вас могут возникнуть такие проблемы, как error adding symbols: File in wrong format,

Вот описание python-openzwave строить с точки зрения вопроса. Почти все шаги соответствуют корню Makefile цели.

  • Предпосылки. Есть несколько независимых целей практически без организации. Большинство используют специфичные для Debian команды.
    • Cython не нужен при сборке из архива (подробности ниже)
  • библиотека openzwave C++ (openzwave openzwave/.lib/ мишень).
    • Построить логику: openzwave/Makefile Вызывается без параметров (но с унаследованным окружением).
    • Входы: openzwave/ поддерево (включает libhidapi а также libtinyxml, статически связанный).
    • Выходы: openzwave/.lib/libopenzwave.{a,so}
    • Принимает PREFIX как envvar (/usr/local по умолчанию)
      • Единственный эффект, который влияет на нас: $(PREFIX)/etc/openzwave/ назначается макросу, который добавляет место поиска для файлов конфигурации (Options.cpp): config/ -> /etc/openzwave/ -> <custom location>,
  • Модуль расширения libopenzwave Python C (install-lib цель - да, запас Makefile не может просто построить это; цель даже не зависит от библиотеки).
    • Построить логику: setup-lib.py
    • Входы: src-lib/, openzwave/.lib/libopenzwave.a
    • Выходы: build/<...>/libopenzwave.so - да, то же имя, что и openzwave выход, так что не путайте их
      • По умолчанию, openzwave статически связан с модулем, поэтому вам не нужно включать первый в развертывание
      • Модуль, однако, нуждается в config папка из библиотеки. Он включен в скрипт сборки при создании пакета.
    • Вопреки тому, что говорит Джим, Cython не требуется для сборки из архива, архив уже содержит сгенерированный .cpp,
    • Теперь подвох: сам модуль использует pkg_resources найти свои данные. Так что вы не можете просто бросить .so а также config в правильный каталог и назовите это день. Вам нужно сделать pkg_resources.get_distribution('libopenzwave') добиться успеха.
      • pkg_resources утверждает, что поддерживает "нормальные пакеты файловой системы, файлы.egg и распакованные файлы.egg".
      • В частности, мне удалось это осуществить: сделать .egg (setup-lib.py bdist_egg), распакуйте его в текущий каталог и переименуйте EGG-INFO в libopenzwave.egg-info (как в site-packages). UserWarning выдается, если я не добавлю .so находится в PYTHON_PATH / sys.path перед импортом модуля.
  • openzwave , pyozwman а также pyozwweb Пакеты Python (install)
    • это чистые пакеты Python. Первый использует модуль расширения C, другие используют первый.
    • Построить логику: setup-api.py, setup-manager.py, setup-web.py
    • Входные данные: src-*/
    • Вывод: (чистый Python)
    • Они используют только pkg_resources.declare_namespace() так что ты будешь в порядке с правильными файлами / папками на sys.path без всяких .egg-info "s
Другие вопросы по тегам