Edited at

pepperに外部モジュール追加してみる。とりあえずrequestsで。

More than 3 years have passed since last update.

こんばんわn0bisukeです。

pepper開発でハマったところとかをメモしていってます。(前回 => PepperのPythonで自作Box作成をしていくメモ)

pythonはrequestモジュールが素晴らしいですね。 http通信するときは積極的に使いたい...ただ、pepperだとpipが使えないので以下の手順でやりましょうって話です。

ちなみに写真は最近うちのチームにジョインしてくれた@ukk0です。記事内容とは関係ありません笑

PepperのHTTP通信にRequestsを使うを参考にしてます。


requestモジュール

httpリクエストをいい感じにしてくれるモジュールです。

urllib2ってあるんですけど、比較にならないくらい簡単です。


  • インストール

$ pip install requests


  • サンプル


app.py

import requests

r = requests.get('http://qiita.com/n0bisuke/items/d07b5485f4e767bc6e20.json')
print r.json()["title"]


Qiitaの投稿の情報を取得します。

http://qiita.com/n0bisuke/items/d07b5485f4e767bc6e20.json


  • 実行

$ python app.py

pepperのpythonでHTTP GETしてJSONパースするサンプル

2行でかけちゃいます。簡単ですね。


pepperで使う

pepperではpipは使えなく、ディレクトリごとぶちこむのが一般的らしいですorz

githubのページからzipでダウンロードしてきて中身のrequestsフォルダをchoregraphe側にぶちこみます。

libフォルダを作成してその中にrequestsフォルダを入れましょう。

あとは前回記事のようにPython Scriptを編集します。


app.py

class MyClass(GeneratedClass):

def __init__(self):
GeneratedClass.__init__(self)

def onLoad(self):
self.framemanager = ALProxy("ALFrameManager")
self.folderName = None

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

def onInput_onStart(self):
import sys, os
self.folderName = os.path.join(self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
if self.folderName not in sys.path:
sys.path.append(self.folderName)

def onInput_onStop(self):
self.onUnload()
self.onStopped()


self.framemanager.getBehaviorPath(self.behaviorId), "../lib"などはさっき作ったlibフォルダへのパス指定をしている感じです。

python詳しくないのでこれ以上は言及しません。


app.py

class MyClass(GeneratedClass):

def __init__(self):
GeneratedClass.__init__(self)

def onLoad(self):
self.framemanager = ALProxy("ALFrameManager")
self.folderName = None

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

def onInput_onStart(self):
import sys, os
self.folderName = os.path.join(self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
if self.folderName not in sys.path:
sys.path.append(self.folderName)
import requests
r = requests.get('http://qiita.com/n0bisuke/items/d07b5485f4e767bc6e20.json') #←追記
title = r.json()["title"].encode("utf-8") #←追記
self.logger.info(title) #←追記

def onInput_onStop(self):
self.onUnload()
self.onStopped()


これでやっとimport requestsできます。

あとは最初に書いたpythonコードと同じ感じですね。

実行してコレグラフのダイアログに以下のようにパースされた文字列が表示されれば成功です。

pepperのpythonでHTTP GETしてJSONパースするサンプル