在非标准位置编译并使用带有open-zwave的python-openzwave

时间:2016-06-09 16:42:51

标签: python c++ z-wave

我手动编译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

我的设置有什么问题?

2 个答案:

答案 0 :(得分:2)

一般来说,所需的步骤包括调用make build来处理构建openzwave的.cpp文件并下载所有依赖项(包括Cython);和make install运行setup-apisetup-lib.py(此安装脚本还为openzwave创建C++ Python扩展名),setup-web.pysetup-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的目标。

  • 先决条件。有几个独立的目标,几乎没有组织。大多数使用特定于Debian的命令。
    • 如果从存档构建(详情如下)
    • ,则不需要Cython
  • openzwave C ++库openzwave openzwave/.lib/目标)。
    • 构建逻辑:openzwave/Makefile,不带参数调用(但使用继承的环境)。
    • 输入:openzwave/子树(包括libhidapilibtinyxml,静态链接。
    • 输出:openzwave/.lib/libopenzwave.{a,so}
    • 接受PREFIX为envvar(默认为/usr/local
      • 影响我们的唯一影响是:$(PREFIX)/etc/openzwave/被分配给宏,该宏为配置文件添加搜索位置(Options.cpp):config/ - &gt; /etc/openzwave/ - &gt; <custom location>
  • libopenzwave Python C扩展模块install-lib目标 - 是的,股票Makefile不能只构建它;目标甚至不依赖于库) 。
    • 构建逻辑:setup-lib.py
    • 输入:src-lib/openzwave/.lib/libopenzwave.a
    • 输出:build/<...>/libopenzwave.so - 是的,与openzwave的输出名称相同,因此请避免混淆
      • 默认情况下, openzwave与模块静态链接,因此您无需将前者包含在部署中
      • 但是,该模块需要库中的config文件夹。在制作包时,它由构建脚本包含。
    • what Jim says相反,不需要从归档构建Cython,归档已包含生成的.cpp
    • 现在,问题是:模块本身使用pkg_resources来定位其数据。因此,您不能只将.soconfig放入当前目录并将其称为一天。你需要让pkg_resources.get_distribution('libopenzwave')成功。
      • pkg_resources claims to support “普通文件系统包,.egg文件和解压缩的.egg文件。”
      • 特别是,我能够解决这个问题:制作一个.eggsetup-lib.py bdist_egg),将其解压缩到当前目录并将EGG-INFO重命名为libopenzwave.egg-info(如它在site-packages)。如果我在导入模块之前没有将UserWarning的位置专门添加到.so / PYTHON_PATH,则会发出sys.path
  • openzwavepyozwmanpyozwweb Python包install
    • 这些是纯Python包。第一个使用C扩展模块,其他使用第一个。
    • 构建逻辑:setup-api.pysetup-manager.pysetup-web.py
    • 输入:src-*/
    • 输出:(纯Python)
    • 他们只使用pkg_resources.declare_namespace()所以只要sys.path上没有任何.egg-info
    • 文件/目录就可以了。