拡張ライブラリの組み込み方法


拡張ライブラリの組み込み方法

 PepperにはPythonの標準ライブラリ(NAOqi2.4.3時点ではPython2.7.3でした)がインストールされており利用できます。ですが、アプリ開発では標準ライブラリ以外の拡張ライブラリを利用したい場面がでてきます。
 この記事では、Choregraphe上での拡張ライブラリの組み込み方法をステップバイステップで紹介します。拡張ライブラリが利用できることにより、Pepperのアプリ開発の可能性が広がるはずです。

サンプルプロジェクトはこちら

ロード用ボックスの作成

手順

1.[Python]ボックスを作成します。
2.以下のコードを onInput_onStart(self): 以下に追加します。onStart入力が呼び出されるとsys.pathにプロジェクト内にある”lib”フォルダをシステムの読み込み対象に加えます。

def onInput_onStart(self):
    appFolder = self.behaviorAbsolutePath().replace(self.behaviorRelativePath(), "")
    self.folderName = os.path.join(appFolder, "lib")
    if self.folderName not in sys.path:
        sys.path.append(self.folderName)
        self.pathModified = True
    self.onReady()

3.以下のコードを onUnload(self): 以下に追加します。このコードはボックスがアンロードされる時追加されたライブラリパスをシステムから取り外します。

def onUnload(self):
    if self.pathModified and self.folderName and self.folderName in sys.path:
        sys.path.remove(self.folderName)
        self.folderName = None

4.作成した[Python]ボックスにonReady()出力を追加します。
5.[Python]ボックスの役割がわかるように[SetPathLibFld]と名前を変更します。

ライブラリフォルダの作成

手順

1.[プロジェクトファイル]パネル内の[+▼]ボタンを押します。
2.ポップアップメニュー[新規フォルダ…]をクリックします。
3.[ディレクトリの…]ウィンドウが表示され、名前に:”lib”を入力し[Create]ボタンを押します。プロジェクトに”lib”フォルダが追加されます。


図:ボックスとフォルダが追加された状態

拡張スクリプトのロード

 requestsライブラリを例にとり、拡張ライブラリを利用できる状態します。本記事はrequestライブラリでの操作を取り上げていますが、そのほかのライブラリでも手順は同様です。

requestsライブラリの紹介

 requestsライブラリはpythonで簡単にREST APIを呼ぶことができる有用な拡張ライブラリです。requestsライブラリを使うことにより、接続が難しいWebAPIを比較的簡単な手順で接続できます。
参考:Requests: 人間のためのHTTP(プロジェクトHP)
http://requests-docs-ja.readthedocs.io/en/latest/

手順

1.新たに[Python]ボックスを作成します。
2.先ほど作成したリネーム済みの[SetPathLibFld]ボックスのonReady出力に、新たに作成した[Python]ボックスのonStart入力を結線します。
3.以下のサイトより利用したい、requestsライブラリ(requests-2.11.1.tar.gz)をダウンロードし展開します。
https://pypi.python.org/pypi/requests/2.11.1
4.展開したフォルダに含まれるライブラリフォルダこの場合”requests”をプロジェクト下の”lib”フォルダにコピーします。ライブラリによってはフォルダを含まないことがあります。この場合はライブラリ名のスクリプトを”lib”フォルダ内にコピーしてください。


図:結線され、ライブラリフォルダが展開された状態
5.新たに作成した[Python]ボックスにrequestsを読み込むためのコードをonInput_onStart(self)に追加します。

def onInput_onStart(self):
    import requests
    self.logger.info(requests.get('http://www.yahoo.co.jp').text.encode('utf-8'))

 上記例では動作を確認するためYahoo!に接続しログにソースデータを書き出す動作となっております。

依存するライブラリが他にも含まれる場合

 ライブラリによっては読み込むコードを実行する段階でエラーになることがあります。依存するライブラリが足りない場合は、エラーが出なくなるまで3.〜4.までの操作を繰り返し行ってください。(依存ライブラリが不足している場合、エラーメッセージにどのライブラリが不足しているかの情報が含まれております)