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

Я вручную скомпилировал питон-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)

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

12

Решение

Как правило, необходимые шаги состоят из звонков 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,

2

Другие решения

Вот описание 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
1

По вопросам рекламы [email protected]