Help us understand the problem. What is going on with this article?

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パースするサンプル
n0bisuke
プロトタイピング専門スクール「プロトアウトスタジオ」で教えたりしてます。 プロフ -> https://dotstud.io/members/n0bisuke
https://protoout.studio
dotstudio
全ての人がモノづくりを楽しむ世界を目指して活動しています。
https://dotstud.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away