在非标准位置编译并使用pythonopenzwave和openzwave

2024-06-01 09:58:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我手动编译了python-openzwave以使用C++ library。在

我想用它作为Kodi插件(OpenELEC运行在pi3上),所以不能使用标准安装。 我已经编译了所有内容,下载了缺少的six和{}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

但当我跑哈罗的时候_世界.py,我得到以下错误-

^{pr2}$

如果我将libopenzwave.alibopenzwave.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)

我的设置有什么问题?在


Tags: infrompyhelloworldsoinit错误
2条回答

一般来说,所需的步骤包括调用make build,它处理为openzwave构建.cpp文件并下载所有依赖项(包括Cython);和{},它运行setup-apisetup-lib.py(此设置脚本还为openzwave创建了C++Python扩展,setup-web.py和{}。在

由于您不能按照您指定的方式运行make install,而是使用它们提供的归档文件,因此在使用make build构建openzwave库之后,创建python扩展的唯一其他选项是为其生成.so文件,而不安装到标准位置。在

在与Cython脚本相同的文件夹中为cython扩展生成.so,方法是运行:

python setup.py build_ext  inplace

这应该在src-lib中创建一个名为libopenzwave.so(它与bin/目录中包含的libopenzwave.so不同)中创建一个共享库,该库包含扩展模块中指定的所有功能。您可以尝试将其添加到libopenzwave文件夹中。在

如果在生成openzwave库的make build期间传递特殊的编译器标志,则在执行setup-lib.py脚本时应指定相同的标志。这可以通过在执行前指定CFLAGS来完成(如指定的here),否则您可能会遇到类似error adding symbols: File in wrong format的问题。在

以下是从问题的角度对python-openzwave的构建的描述。几乎所有的步骤都对应于根Makefile的目标。在

  • 先决条件。有几个独立的目标,几乎没有组织。大多数使用Debian特定的命令。
    • 如果从存档中构建,则不需要Cython(详细信息如下)
  • 强> opnWaveC++库< /St>(^ {< CD3> }目标)。
    • 构建逻辑:openzwave/Makefile,不带参数调用(但使用继承的环境)。在
    • 输入:openzwave/子树(包括libhidapi和{},静态链接)。在
    • 输出: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文件夹。它在生成包时包含在生成脚本中。在
    • what Jim says相反,Cython不需要从存档构建,存档已经包含生成的.cpp。在
    • 现在,问题是:模块本身使用pkg_resources来定位其数据。因此,不能将.soconfig放到current目录中,然后就结束了。您需要使pkg_resources.get_distribution('libopenzwave')成功。
      • pkg_resourcesclaims to support“普通文件系统包、.egg文件和解包的.egg文件。”
      • 特别是,我能够做到这一点:创建一个.eggsetup-lib.py bdist_egg),将其解压到当前目录中,并将EGG-INFO重命名为libopenzwave.egg-info(就像在site-packages中一样)。如果我在导入模块之前没有明确地将.so的位置添加到PYTHON_PATH/sys.path中,则发出UserWarning。在
  • openzwavepyozwman和{}Python包install
    • 这些是纯Python包。第一个使用C扩展模块,其他的使用第一个。在
    • 构建逻辑:setup-api.pysetup-manager.pysetup-web.py
    • 输入:src-*/
    • 输出:(纯Python)
    • 它们只使用pkg_resources.declare_namespace(),所以你可以在sys.path上使用正确的文件/目录,而不使用任何.egg-info

相关问题 更多 >