2016-06-09 9 views
12

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

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

Моя текущая структура каталоги выглядит следующим образом:

- 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) 

Wh у меня неправильная настройка?

+0

вы уверены, что ваш модуль имеет данные инициализации, как сказано здесь: https://docs.python.org/3/ extend/extend.html # the-module-s-method-table-and-initialization-function? – noteness

+0

Вручную скомпилировано, как именно? Не обнаруживать 'initlibopenzwave' не вызывает' initlibopenzwave', поскольку файлы 'Cython' не являются' cythonized' и скомпилированы правильно ('Cython' позаботится о создании' init 'функций для вас. Не могли бы вы подробнее остановиться на процесс компиляции? –

+0

@Jim, я загрузил источник https://github.com/OpenZWave/python-openzwave/raw/master/archives/python-openzwave-0.3.1.tgz, распаковал его и запустил 'make build '. Эта версия не требует' Cython' в соответствии с этим обсуждением - https://groups.google.com/forum/#!topic/python-openzwave-discuss/Yrgf-Xg5XRk. –

ответ

2

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

Поскольку вы не можете запустить make install, как было указано, и вместо этого, используя архив они предоставляют, только другие варианты для создания питона расширение, после построения 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 перед выполнением его (как указано here), иначе у вас могут возникнуть проблемы, такие как error adding symbols: File in wrong format.

1

Описание конструкции 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 (цель - да, запас Makefile может не только построить его, цель даже не зависимость от библиотеки).
    • Сложение логика: setup-lib.py
    • Входы: src-lib/, openzwave/.lib/libopenzwave.a
    • Выходы: build/<...>/libopenzwave.so - да, такое же имя, как выход openzwave «s, поэтому не спутать их
      • По умолчанию openzwave является связанный статически с модулем, поэтому вам не нужно включать его в развертывание
      • Th e, однако, требуется папка config из библиотеки. Он включается скриптом сборки при создании пакета.
    • Вопреки what Jim says, Cython не нужно строить из архива, архив уже содержит сгенерированный .cpp.
    • Теперь улов: сам модуль использует pkg_resources, чтобы найти его данные. Поэтому вы не можете просто отбросить .so и config в currect-каталог и называть его днем. Вам нужно сделать pkg_resources.get_distribution('libopenzwave').
      • pkg_resourcesclaims to support"нормальные файловые пакеты, .egg файлы и распаковать .egg файлов."
      • В частности, я был в состоянии осуществить это: сделать .egg (setup-lib.py bdist_egg), распаковать его в текущий каталог и переименовать EGG-INFO в libopenzwave.egg-info (как это в site-packages).A 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