Скомпилируйте и используйте 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