2016-06-09 76 views
12

我手動編譯python-openzwaveC++ library一起工作。在非標準位置編譯和使用open-zwave的python-openzwave

我想用它作爲Kodi插件(在Pi 3上運行的OpenELEC),所以不能使用標準安裝。 我已經編譯好了一切,下載了缺失sixlouie庫,現在試着運行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.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) 

Wh在我的設置錯誤?

+0

你確定你的模塊的初始化信息,這裏說:https://docs.python.org/3/ extends/extends.html#the-module-s-method-table-and-initialization-function? – noteness

+0

手動編譯如何?如果我沒有弄錯''Cython'文件沒有被'cythonized'編譯並且編譯正確('Cython'爲你創建'init ''的功能,你能否找到'initlibopenzwave'編譯過程? –

+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,它處理爲openzwave構建.cpp文件並下載所有依賴關係(包括Cython);和make install,它運行setup-api, setup-lib.py(此安裝腳本還創建了C++ Python for openzwave擴展),setup-web.pysetup-manager.py

既然你指定你不能運行make install,並且不使用他們提供的檔案,唯一的選項用於創建蟒蛇extention,與make build建設openzwave庫後,正在生成.so文件,它無需安裝標準位置。

.so在同一文件夾中Cython腳本用Cython extention建設可以通過以下實現:

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/子樹(包括libhidapilibtinyxml,靜態鏈接)。
    • 輸出: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的輸出,所以避免混淆他們
      • 默認情況下,openzwave是與模塊靜態鏈接,因此您不需要將前者納入部署中
      • Th然而,e模塊需要庫中的config文件夾。構建腳本包含在製作包中時。
    • 相反what Jim says,從歸檔建立不需要用Cython,存檔已經包含所生成的.cpp
    • 現在,問題是:模塊本身使用pkg_resources來查找其數據。所以你不能把.soconfig放到currect目錄中,並且每天都會調用它。您需要使pkg_resources.get_distribution('libopenzwave')成功。
      • pkg_resourcesclaims to support「普通的文件系統包,.egg文件,解壓縮及文件.egg。」
      • 特別是,我能夠順利完成這件事:做一個.eggsetup-lib.py bdist_egg),解壓到當前目錄下,並重新命名爲EGG-INFOlibopenzwave.egg-info(就像它在site-packages)。如果在導入模塊之前沒有專門將.so的位置添加到PYTHON_PATH/sys.path中,則會發出UserWarning
  • openzwavepyozwmanpyozwweb Python包install
    • 這些都是純Python包。第一個使用C擴展模塊,其他使用第一個。
    • 構建邏輯:setup-api.pysetup-manager.pysetup-web.py
    • 輸入:src-*/
    • 輸出:(純Python)
    • 他們只用pkg_resources.declare_namespace()所以你會被罰款只有正確的文件/上sys.path迪爾斯無任何.egg-info