我手动编译python-openzwave以使用C++ library。
我想用它作为Kodi插件(在Pi 3上运行OpenELEC),所以不能使用标准安装。
我已经编译了所有内容,下载了丢失的<input name="test" type="text">
和six
库,现在尝试运行louie
。
我目前的目标结构如下:
hello_world.py
但是当我运行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
如果我将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
我的设置有什么问题?
答案 0 :(得分:2)
一般来说,所需的步骤包括调用make build
来处理构建openzwave的.cpp
文件并下载所有依赖项(包括Cython
);和make install
运行setup-api
,setup-lib.py
(此安装脚本还为openzwave创建C++
Python扩展名),setup-web.py
和setup-manager.py
。
由于您无法按照指定运行make install
而是使用它们提供的存档,因此在使用make build
构建openzwave库之后,创建python扩展的唯一其他选项是生成{ {1}}文件,无需安装到标准位置。
通过运行以下内容,在.so
脚本所在的文件夹中构建cython extention的.so
:
Cython
这应该在名为python setup.py build_ext --inplace
的{{1}}中创建一个共享库(它与src-lib
目录中包含的libopenzwave.so
不同),其中包含在libopenzwave.so
目录中指定的所有功能。扩展模块。您可以尝试将其添加到bin/
文件夹。
如果在libopenzwave
期间传递特殊的编译器标志来构建openzwave库,则在执行make build
脚本时应指定相同的标志。这可以通过在执行setup-lib.py
之前指定CFLAGS
来完成,或者您可能遇到类似error adding symbols: File in wrong format
的问题。
答案 1 :(得分:1)
以下是问题视角下python-openzwave
构建的描述。几乎所有步骤都对应于根Makefile
的目标。
openzwave openzwave/.lib/
目标)。
openzwave/Makefile
,不带参数调用(但使用继承的环境)。openzwave/
子树(包括libhidapi
和libtinyxml
,静态链接。openzwave/.lib/libopenzwave.{a,so}
PREFIX
为envvar(默认为/usr/local
)
$(PREFIX)/etc/openzwave/
被分配给宏,该宏为配置文件添加搜索位置(Options.cpp
):config/
- &gt; /etc/openzwave/
- &gt; <custom location>
。install-lib
目标 - 是的,股票Makefile
不能只构建它;目标甚至不依赖于库) 。
setup-lib.py
src-lib/
,openzwave/.lib/libopenzwave.a
build/<...>/libopenzwave.so
- 是的,与openzwave
的输出名称相同,因此请避免混淆
openzwave
与模块静态链接,因此您无需将前者包含在部署中config
文件夹。在制作包时,它由构建脚本包含。.cpp
。pkg_resources
来定位其数据。因此,您不能只将.so
和config
放入当前目录并将其称为一天。你需要让pkg_resources.get_distribution('libopenzwave')
成功。
pkg_resources
claims to support “普通文件系统包,.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
)
setup-api.py
,setup-manager.py
,setup-web.py
src-*/
pkg_resources.declare_namespace()
所以只要sys.path
上没有任何.egg-info
的