趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • Python2.7のプログラムをexe化する

    投稿日 2018年 6月 11日 コメントはありません

    次に、Python2.7で作ったプログラムを配布用にexe化してみます。
    まず、仮想環境を作ります。

    D:\virtual-python>py -2 -m virtualenv py2exe1 --system-site-packages
    New python executable in D:\virtual-python\py2exe1\Scripts\python.exe
    Installing setuptools, pip, wheel...done.
    D:\virtual-python>cd py2exe1
    D:\virtual-python\py2exe1>scripts\activate.bat
    (py2exe1) D:\virtual-python\py2exe1>

    次に、py2exeをインストールします。試しにpipでやってみると、

    (py2exe1) D:\virtual-python\py2exe1>py -2 -m pip install py2exe
    Collecting py2exe
    Downloading https://files.pythonhosted.org/packages/e9/a9/040d38b60bca5b19ff5599a6cbe52b4b9a4fb27986a44fc35f72d9e729e6/py2exe-0.9.2.2.zip (129kB)
    100% |################################| 133kB 2.3MB/s
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\setup.py", line 10, in <module>
    raise RuntimeError("This package requires Python 3.3 or later")
    RuntimeError: This package requires Python 3.3 or later
    
    ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\
    
    (py2exe1) D:\virtual-python\py2exe1>

    ということで、pipでインストールできるpy2exeはpython3.3以降が必要、ということでエラーになります。ですので、sourceforgeから2.7用のインストーラをダウンロードしてきて実行します。インストーラはexe形式のGUIになっていて、デフォルトでは大元のsite-packagesの下にインストールされるようです。

    exeに変換するにはセットアップスクリプトが必要なようですので、まずは以下の内容で作成しました。

    from distutils.core import setup
    import py2exe
        
    option = {
        'compressed' : 1,
        'optimize' : 2,
        'bundle_files' : 1,
    }
    
    setup(
        options = {
            'py2exe' : option ,
        },
        console = [
            {'script' : 'main.py'}
        ],
        zipfile = None,
    )

    今回は、メインのスクリプト(処理が始まるところ)は main.py なので、main.py を指定。bundle_filesに1を指定すると、生成したexeファイルにランタイムdllを含めてくれるので、配布が楽になります。(代わりにサイズが大きくなります)

    自作のログ解析ツールをLOGというサブディレクトリにソースコードを一式置いてexe化してみました。

    (py2exe1) D:\virtual-python\py2exe1>cd LOG
    (py2exe1) D:\virtual-python\py2exe1\LOG>python setup.py py2exe
    running py2exe
    creating D:\virtual-python\py2exe1\LOG\build
     :
     :(途中略)
     :
    copying C:\Python27\DLLs\unicodedata.pyd -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
    *** copy dlls ***
    copying C:\WINDOWS\system32\CRYPT32.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
    copying C:\WINDOWS\system32\python27.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7
    setting sys.winver for 'D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7\python27.dll' to 'py2exe'
    copying C:\Python27\lib\site-packages\py2exe\run.exe -> D:\virtual-python\py2exe1\LOG\dist\main.exe
    Adding python27.dll as resource to D:\virtual-python\py2exe1\LOG\dist\main.exe
    The following modules appear to be missing
    ['ElementC14N', '_scproxy', 'cElementTree', 'distutils.command', 'distutils.command.build_ext', ... ]
    
    *** binary dependencies ***
    Your executable(s) also depend on these dlls which are not included,
    you may or may not need to distribute them.
    
    Make sure you have the license if you distribute any of them, and
    make sure you don't distribute files belonging to the operating system.
    
       OLEAUT32.dll - C:\WINDOWS\system32\OLEAUT32.dll
       USER32.dll - C:\WINDOWS\system32\USER32.dll
       SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll
       ole32.dll - C:\WINDOWS\system32\ole32.dll
       ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll
       WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll
       GDI32.dll - C:\WINDOWS\system32\GDI32.dll
       KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll
    
    (py2exe1) D:\virtual-python\py2exe1\LOG>

    それほど時間がかからずに処理が終わり、buildとdistというサブディレクトリができて、distの下にmain.exe という実行ファイルが作成されていました。今回の場合はサイズは6MBほど、できた実行ファイルを実行してみると、特に問題なく動作しました。

    ということで、意外にあっさりexe化に成功しました。


  • Windows10にPython環境を構築

    投稿日 2018年 6月 10日 コメントはありません

    訳あって、Windows10(たまたま32bit版)上でPythonの環境を構築しています。
    で、Python2.7系とPython3系を同時に使いたいのと、Pythonの仮想環境を利用したい(作ったスクリプトを他人に使わせるには必要なパッケージが明確になってないといけない)ので、いろいろ調べながらやってます。

    1.Pythonのインストール

    まず、Python3系をインストーラを使ってインストールします。インストール時には「Add Python to environment variables」のチェックは外しておきます。py.exeに起動するPythonを選ばせるためみたいです。

    次に、Python2系をやはりインストーラを使ってインストールします。インストール時には「Register Extensions」を外します。

    インストールできたかどうかは

    C:\>py -2 -V
    C:\>py -3 -V

    としてそれぞれPython2系、Python3系が起動できているか確認します。

    2.virtualenvのインストール

    Python2系用の仮想環境を作成するvirtualenvをインストールします。

    デフォルトの文字コードがasciiだと失敗するようなので、デフォルトの文字コードを変更します。C:\Python27\Lib\site-packages の下に、sitecustomize.py という名前で以下のファイルを作成します。

    import sys
    sys.setdefaultencoding('cp932')

    作成したら、反映されていることを確認します。

    c:\Python27>py -2
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    次に、pipをバージョンアップします。

    c:\Python27>py -2 -m pip install --upgrade pip
    Collecting pip
    Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 451kB/s
    Installing collected packages: pip
    Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
    Successfully uninstalled pip-9.0.3
    Successfully installed pip-10.0.1
    
    c:\Python27>

    次に、virtualenvをインストールします

    c:\Python27>py -2 -m pip install virtualenv
    Collecting virtualenv
    Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
    100% |################################| 1.9MB 2.2MB/s
    Installing collected packages: virtualenv
    The script virtualenv.exe is installed in 'C:\Python27\Scripts' which is not on PATH.
    Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
    Successfully installed virtualenv-16.0.0
    
    c:\Python27>

    3.virtualenvを使ってみる

    早速Python2.7の仮想環境を作ってみます。

    D:\>mkdir virtual-python
    D:\>cd virtual-python
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    :
    :(中略)
    :
    File "D:\virtual-python\testenv\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 7: ordinal not in range(128)
    ----------------------------------------
    :
    :(中略)
    :
    OSError: Command D:\virtual-python\testenv\Scripts\python.exe - setuptools pip wheel failed with error code 2
    D:\virtual-python>

    ということで、エラーになってしまいます。で、エラーの原因はまた「UnicodeDecodeError」です。
    原因は、どっかにあるvirtualenv.pyの中で文字コードがascii決め打ちになっているsite.pyを仮想環境の中に展開して、それを使ってしまうために起きているように見えます。
    いろいろやってみると、virtualenvを再実行しても一旦ディレクトリを消したりはしないようですので、これを逆手にとって、一度実行してエラーになってから、sitecustomize.py をコピーしてやるととりあえず最後まで処理が進むようです。
    具体的には、上記の例の場合、エラーになってから、sitecustomize.py をコピーしてきてから再度 virtualenv を起動します。(注:そんなことをしなくてもいい方法がありました・・・後のほうに書いてあります

    D:\virtual-python>copy C:\Python27\Lib\site-packages\sitecustomize.py d:\virtual-python\testenv\Lib\site-packages\.
    1 個のファイルをコピーしました。
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    Installing setuptools, pip, wheel...done.

    ということで、旨くいきました。仮想環境への移行も

    D:\virtual-python>cd testenv
    D:\virtual-python\testenv>Scripts\activate.bat
    (testenv) D:\virtual-python\testenv>python -V
    Python 2.7.15
    (testenv) D:\virtual-python\testenv>
    

    でうまくいくようです。
    この上で、scriptsフォルダの下にあるactivate.batを動かして仮想環境に移行後、python2用に作成したスクリプトを動かしてみましたが、無事に動作しました。

    直後に追記)
    こんな回りくどいことをしなくても、–system-site-packages と付ければOKのようです。
    (下記1行目がその例です)

    D:\virtual-python>py -2 -m virtualenv testenv2 --system-site-packages
    New python executable in D:\virtual-python\testenv2\Scripts\python.exe
    Installing setuptools, pip, wheel...done.
    D:\virtual-python>cd testenv2
    D:\virtual-python\testenv2>Scripts\activate.bat
    (testenv2) D:\virtual-python\testenv2>python -V
    Python 2.7.15
    (testenv2) D:\virtual-python\testenv2>python
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    4.venvを使ってみる

    Python3系用の仮想環境のvenvを使ってみます。こちらはpython3系には標準で入っているので簡単です。使い方はvirtualenvとほぼ同じ。

    D:\>cd virtual-python
    D:\virtual-python>py -3 -m venv testenv3
    D:\virtual-python>cd testenv3
    D:\virtual-python\testenv3>Scripts\activate.bat
    (testenv3) D:\virtual-python\testenv3>python -V
    Python 3.6.5
    (testenv3) D:\virtual-python\testenv3>

    でPython3系が動くことが確認できました。


  • esp8266用の環境を構築する(続き)

    投稿日 2015年 4月 10日 コメントはありません

    ESP8266用の環境構築の続きです。

    7.MicroPythonをビルドしてみる

    ExampleはMakefileが複雑すぎる、ということでESP8266用のMicroPythonをビルドしてみました。

    1)ソースコードのダウンロード

    gitでダウンロードしてきます。

    ~$ git clone https://github.com/micropython/micropython
    Cloning into 'micropython'...
    remote: Counting objects: 26530, done.
    remote: Compressing objects: 100% (341/341), done.
    remote: Total 26530 (delta 165), reused 0 (delta 0), pack-reused 26185
    Receiving objects: 100% (26530/26530), 17.02 MiB | 1.85 MiB/s, done.
    Resolving deltas: 100% (18858/18858), done.
    Checking connectivity... done.
    ~$

    2)ビルドしてみる

    makeしてみます。

    ~$ cd micropython/
    ~/micropython$ ls
    ACKNOWLEDGEMENTS bare-arm esp8266 logo stmhal unix
    CODECONVENTIONS.md cc3200 examples minimal teensy unix-cpy
    LICENSE docs extmod py tests windows
    README.md drivers lib qemu-arm tools
    ~/micropython$ cd esp8266/
    ~/micropython/esp8266$ make
    Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
    mkdir -p build/genhdr
    CPP ../py/qstrdefs.h
    makeqstrdata ../py/qstrdefs.h qstrdefsport.h 
    Generating build/genhdr/py-version.h
    mkdir -p build/lib/mp-readline
    mkdir -p build/py
    mkdir -p build/py/../extmod
    mkdir -p build/stmhal
    CC ../py/mpstate.c
    CC ../py/nlrx86.S
       :
       :
    CC ../py/../extmod/moduhashlib.c
    CC ../py/../extmod/modubinascii.c
    CC strtoll.c
    CC main.c
    CC esp_mphal.c
    esp_mphal.c:28:21: fatal error: ets_sys.h: No such file or directory
     #include "ets_sys.h"
                         ^
    compilation terminated.
    make: *** [build/esp_mphal.o] エラー 1
    ~/micropython/esp8266$

    ということで、ヘッダファイルが見つからないようで、エラーになってしまいました。

    3)原因調査とMakefileの修正

    このファイルはSDKの中に含まれているようです。

    ~$ find . -name "ets_sys.h" -print
    ./esp-open-sdk/esp_iot_sdk_v0.9.5/include/ets_sys.h

    ~/esp-open-sdk ディレクトリの下では、SDKのインストール時に sdk から esp_iot_sdk_v0.9.5 へのシンボリックリンクが張られているので、Makefileの冒頭にあるESP_SDKの定義を以下のとおり修正します。(コメントアウトしたのが修正前の内容)

    #ESP_SDK = $(shell $(CC) -print-sysroot)/usr
    ESP_SDK = /home/xxx/esp-open-sdk/sdk

    4)ビルドの続き

    ビルドの続きを行います。

    ~/micropython/esp8266$ make
    Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
    Generating build/genhdr/py-version.h
    CC esp_mphal.c
    CC gccollect.c
    CC uart.c
    CC modpyb.c
    CC modpybpin.c
    CC modesp.c
    AS gchelper.s
    CC ../stmhal/printf.c
    CC ../stmhal/string0.c
    CC ../stmhal/pyexec.c
    CC ../stmhal/pybstdio.c
    CC ../lib/mp-readline/readline.c
    LINK build/firmware.elf
     text data bss dec hex filename
     283992 1456 48664 334112 51920 build/firmware.elf
    Create build/firmware-combined.bin
    ('flash ', 48288)
    ('padding ', 17248)
    ('irom0text', 237208)
    ('total ', 302744)
    ~/micropython/esp8266$

    無事にビルドができました。

    8.esptoolの準備

    ESP8266のROM書き換えのためのツールである esptool も ~/esp-open-sdk/esptool の下に準備されます。

    ESP8266との接続の方法はこのディレクトリ内の README.md に記述されています。

    ## Protocol
    If GPIO0 and GPIO15 is pulled down and GPIO2 is pulled high when the module leaves reset, then the bootloader will enter the UART download mode. The ROM auto-bauds, that is, it will automagically detect which baud rate you are using. esptool defaults to 115200.
    esptool uses the RTS and DTR modem status lines to automatically enter the bootloader.
    Connect RTS to CH_PD (which is used as active-low reset) and DTR to GPIO0.
    

    ということで、ESP8266とUSB-UARTモジュールの間を以下の結線をします。

    • CH-PDをRTSに接続
    • GPIO0をDTRに接続
    • GPIO15をGNDへプルダウン
    • GPIO2を3.3Vへプルアップ

    この接続をしておけばesptoolが勝手にESP8266をブートローダモードに移行させてくれるようです。
    <esptoolsの参考情報>
    https://testpypi.python.org/pypi/esptool/0.1.0

     9.Hack a Dayで発見した記事

    Hack a DayでESP8266に書き込む方法が載ってました。

    http://hackaday.com/2015/03/18/how-to-directly-program-an-inexpensive-esp8266-wifi-module/


  • MicroPythonをビルドしてみた

    投稿日 2015年 3月 19日 コメントはありません

    MicroPythonをUbuntu上でビルドしてみました。

    まあ、特に難しいところはなくビルドできちゃいました。

    1.ソースを持ってきます

    なんのことはなく、gitコマンドで持ってきます。

    ~$ mkdir micropython
    ~$ cd micropython/
    ~/micropython$ git clone https://github.com/micropython/micropython
    Cloning into 'micropython'...
    remote: Counting objects: 26526, done.
    remote: Compressing objects: 100% (337/337), done.
    remote: Total 26526 (delta 163), reused 0 (delta 0), pack-reused 26185
    Receiving objects: 100% (26526/26526), 17.01 MiB | 1.30 MiB/s, done.
    Resolving deltas: 100% (18856/18856), done.
    Checking connectivity...

    2.ビルドします

    unixディレクトリに移動して、makeするだけです。

    ~/micropython$ cd micropython/
    ~/micropython/micropython$ cd unix
    ~/micropython/micropython/unix$ make
        :
        :
    modffi.c:32:17: fatal error: ffi.h: そのようなファイルやディレクトリはありません
    #include <ffi.h>
    ^
    compilation terminated.
    make: *** [build/modffi.o] エラー 1
    ~/micropython/micropython/unix$

    一部ヘッダがないと怒られてしまいました。調べてみると、libff-devパッケージに含まれるヘッダファイルのようです。

    パッケージを追加して続けます。

    ~/micropython/micropython/unix$ sudo apt-get install libffi-dev
    パッケージリストを読み込んでいます... 完了
    依存関係ツリーを作成しています 
    状態情報を読み取っています... 完了
    以下のパッケージが新たにインストールされます:
     libffi-dev
    アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 9 個。
    99.8 kB のアーカイブを取得する必要があります。
    この操作後に追加で 323 kB のディスク容量が消費されます。
    取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty/main libffi-dev amd64 3.1~rc1+r3.0.13-12 [99.8 kB]
    99.8 kB を 0秒 で取得しました (199 kB/s)
    以前に未選択のパッケージ libffi-dev:amd64 を選択しています。
    (データベースを読み込んでいます ... 現在 386967 個のファイルとディレクトリがインストールされています。)
    Preparing to unpack .../libffi-dev_3.1~rc1+r3.0.13-12_amd64.deb ...
    Unpacking libffi-dev:amd64 (3.1~rc1+r3.0.13-12) ...
    Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
    Processing triggers for doc-base (0.10.5) ...
    Processing 1 added doc-base file...
    Registering documents with scrollkeeper...
    Processing triggers for install-info (5.2.0.dfsg.1-2) ...
    libffi-dev:amd64 (3.1~rc1+r3.0.13-12) を設定しています ...
    ~/micropython/micropython/unix$

    気を取り直してmakeするとあっさり完了しました。

    3.試しに動かしてみる

    ドキュメント通りに動かしてみます。

    ~/micropython/micropython/unix$ ./micropython
    Micro Python v1.3.10-215-g005a7f4 on 2015-03-17; linux version
    >>> list(5 * x + y for x in range(10) for y in [4, 2, 1])
    [4, 2, 1, 9, 7, 6, 14, 12, 11, 19, 17, 16, 24, 22, 21, 29, 27, 26, 34, 32, 31, 39, 37, 36, 44, 42, 41, 49, 47, 46]
    >>> quit()
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    NameError: name 'quit' is not defined
    >>>

    quit()では終了できず、Ctrl-Dで終了させます。

    4.テストにかけてみる

    これもドキュメント通りに。

    ~/micropython/micropython/unix$ make test
    Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
    cd ../tests && MICROPY_MICROPYTHON=../unix/micropython ./run-tests
    pass basics/0prelim.py
    pass basics/andor.py
    pass basics/array1.py
      :
    pass unix/ffi_callback.py
    pass unix/ffi_float.py
    395 tests performed (15494 individual testcases)
    395 tests passed
    ~/micropython/micropython/unix$

    あっさり動きました。


  • USB LCDモジュールの製作

    投稿日 2013年 10月 12日 コメントはありません

    PIC18F14K50を使ってUSBで接続・制御するグラフィックLCDモジュールを作ってみました。

    OLYMPUS DIGITAL CAMERA

    LCDモジュールは手持ちの秋月の128×64のグラフィック液晶です。

    OLYMPUS DIGITAL CAMERA

    PIC18F14K50では端子が不足するので、74HC273(Dラッチ)を使って制御信号をラッチしてからLCDモジュールのデータ線に信号を与えています。

    OLYMPUS DIGITAL CAMERA

    この74HC273はパーツ箱に眠っていたもので、デートコードは8820でした。つまり1988年の第20週ですから25年以上前の1988年5月下旬頃に製造されたものということになります。無事に動くか少し不安ではありましたが・・・。

    OLYMPUS DIGITAL CAMERA

    裏側はこんな感じでぐちゃぐちゃになってしまいました。本当はLCDは180度回した形で取り付けたかったのですが、このLCD、図面の右側から端子が振ってあって、思いっきり間違えてしまいました。それで急遽LCDの方を回して、コネクタをもう一つつける形にしてしまいました。

    ファームウェアは例によって /dev/ttyACM0 としてUSBシリアルとして認識されるようになっていて、液晶モジュールへの制御信号とデータの繰り返しで垂れ流すとそのままLCDモジュールをPICが制御するようになっています。PC側はPythonで記述してあって、一旦GDライブラリを使ってビットマップ上にTrueType(のビットマップフォント)を展開した後、LCD用のコマンド列を生成するようになっています。LCDにはnaga10フォントで半角24文字×6行の表示ができるようになっています。


  • TwitterのストリーミングAPIを試してみた

    投稿日 2013年 9月 3日 1つのコメント

    Twitterからリアルタイムに情報を得るStreaming APIを試してみました。

    $ sudo easy_install pip
    $ sudo pip install tweepy --upgrade

    として、パッケージ管理ツール pip をインストールした後、tweepy をアップグレードしました。その後、キーワードを含む tweet を入手するスクリプトをいろんなところを参考にしながらなんとか作りました。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import sys
    import json
    import tweepy  
    import re
    
    # Account 
    consumer_key= '  '
    consumer_secret= ' '
    access_token= ' '
    access_token_secret= ' '
    
    class Listener(tweepy.streaming.StreamListener):
        def on_data(self, data):
            if data.startswith("{"):
                tweet = json.loads(data)
                if 'text' in tweet:
                    user = tweet['user']
                    text = re.sub(r'\n',r' ',tweet['text'].encode('utf-8')) # 改行コード除去
                    print tweet['id'],":",tweet['lang'],":",user['screen_name'].encode('utf-8'),":", \
                                  user['name'].encode('utf-8'),":", text
            return True
    
        def on_error(self, status):
            print status
    
    if __name__ == '__main__':
        l = Listener()
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
    
        stream = tweepy.Stream(auth, l)
    #    filterの宣言部分 @ /usr/local/lib/python2.7/dist-packages/tweepy/streaming.py
    #    def filter(self, follow=None, track=None, async=False, locations=None, 
    #        count = None, stall_warnings=False, languages=None):
    #    パラメータの使い方は https://dev.twitter.com/docs/streaming-apis/parameters
        stream.filter(languages=['ja'],track=['AKB', 'HKT', 'NMB'])

    15~27行目がデータ受信時の処理で、データを分析してユーザー名やscreeen_name、tweetの内容などを表示します。29行目からが認証で、34行目でstreaming apiを呼び出しています。
    39行目でフィルタの内容を設定していて、ここでは日本語のTweetで、「AKB,HKT,NMB」を含むものをキーワードとしています。キーワードは日本語のようなスペース区切りではない言語では正常に動作しないようです。

    同じ処理は、on_data ではなく、 on_statusを使うとJSONの解析もTweepy側でやってくれるようで、on_status版も上げておきます。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import sys
    import json
    import tweepy  
    import re
    
    # Account
    consumer_key= ' '
    consumer_secret= ' '
    access_token= ' '
    access_token_secret= ' '
    
    class Listener(tweepy.streaming.StreamListener):
        def on_status(self, status):
            print status.id,":", \
                   status.lang,":", \
                   status.user.screen_name.encode("utf-8"),":", \
                   status.user.name.encode("utf-8"),":", \
                   re.sub(r'\n',r' ',status.text.encode("utf-8"))
            return True
    
        def on_error(self, status):
            print status
    
    if __name__ == '__main__':
        l = Listener()
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
    
        stream = tweepy.Stream(auth, l)
    #    filterの宣言部分 @ /usr/local/lib/python2.7/dist-packages/tweepy/streaming.py
    #    def filter(self, follow=None, track=None, async=False, locations=None, 
    #        count = None, stall_warnings=False, languages=None):
    #    パラメータの使い方は https://dev.twitter.com/docs/streaming-apis/parameters
        stream.filter(languages=['ja'],track=['AKB', 'HKT', 'NMB'])

    取得できるデータは、あるtweetを参考に分析してみたところ、

    {u'contributors': None,
     u'truncated': False,
     u'text': u'\u301017\u6642....00#NMB #HKT48\u3000#HKT',
     u'in_reply_to_status_id': None,
     u'id': 3744....11520,
     u'favorite_count': 0,
     u'source': u'<a href="http://twittbot.net/" rel="nofollow">twittbot.net</a>',
     u'retweeted': False,
     u'coordinates': None,
     u'entities': {u'symbols': [],
                   u'user_mentions': [],
                   u'hashtags': [{u'indices': [68, 74], u'text': u'AKB48'},
                                 {u'indices': [75, 79], u'text': u'AKB'},
                                 {u'indices': [80, 86], u'text': u'SKE48'},
                                 {u'indices': [87, 91], u'text': u'SKE'},
                                 {u'indices': [92, 98], u'text': u'NMB48'},
                                 {u'indices': [99, 103], u'text': u'NMB'},
                                 {u'indices': [104, 110], u'text': u'HKT48'},
                                 {u'indices': [111, 115], u'text': u'HKT'}],
                   u'urls': [{u'url': u'http://t.co/f4....w6kL', u'indices': [8, 30], u'expanded_url': u'http://com.nicovideo.jp/community/co....411', u'display_url': u'com.nicovideo.jp/community/co....\u2026'}]},
     u'in_reply_to_screen_name': None,
     u'id_str': u'3744....1520',
     u'retweet_count': 0,
     u'in_reply_to_user_id': None,
     u'favorited': False,
     u'user': {u'follow_request_sent': None,
               u'profile_use_background_image': True,
               u'default_profile_image': True,
               u'id': 63.....87,
               u'verified': False,
               u'profile_image_url_https': u'https://.......png',
               u'profile_sidebar_fill_color': u'DDEEF6',
               u'profile_text_color': u'333333',
               u'followers_count': 1,
               u'profile_sidebar_border_color': u'C0DEED',
               u'id_str': u'63.....87',
               u'profile_background_color': u'C0DEED',
               u'listed_count': 0,
               u'profile_background_image_url_https': u'https://......png',
               u'utc_offset': 32400,
               u'statuses_count': 25632,
               u'description': None,
               u'friends_count': 1,
               u'location': u'',
               u'profile_link_color': u'0084B4',
               u'profile_image_url': u'http://......png',
               u'following': None,
               u'geo_enabled': False,
               u'profile_background_image_url': u'http://......png',
               u'name': u'\u308a\u3063..........\uff09',
               u'lang': u'ja',
               u'profile_background_tile': False,
               u'favourites_count': 0,
               u'screen_name': u'KK....ty',
               u'notifications': None,
               u'url': None,
               u'created_at': u'Sun Jul 15 18:..:.. +0000 2012',
               u'contributors_enabled': False,
               u'time_zone': u'Osaka',
               u'protected': False,
               u'default_profile': True,
               u'is_translator': False},
     u'geo': None,
     u'in_reply_to_user_id_str': None,
     u'possibly_sensitive': False,
     u'lang': u'ja',
     u'created_at': u'Mon Sep 02 08:..:.. +0000 2013',
     u'filter_level': u'medium',
     u'in_reply_to_status_id_str': None,
     u'place': None}

    というような感じで、ユーザー名などは入れ子になったデータ構造になっていますので、on_data版ではソースの20行目のように一旦’user’データを取り出しています。

     


  • 環境情報をRaspberry PiでTweetしてみる

    投稿日 2012年 9月 16日 コメントはありません

    いろいろネタが揃ってきたので、 Raspberry Piで環境情報をつぶやかせてみることにしました。

    まず、環境を取得するハードウェアは、以前作った気圧計・温湿度計を使います。LCDの表示がついていますが、とりあえずはそのままにしておきます。Arduinoベースのこの気圧計・温湿度計は、5秒ごとに気圧、温度、湿度を測定し、9600bpsでUSBシリアルに送信してきます。

    続きを読む »


  • Pythonでシリアルポート操作

    投稿日 2012年 9月 15日 コメントはありません

    ArduinoベースのデバイスをUSB経由で操作するにはシリアルポートとして操作するのが一番お手軽です。
    そこで、こんどはシリアルポートの操作をPythonで行う方法を試してみました。

    続きを読む »


  • Twitter用Pythonライブラリのtweepyを試してみました

    投稿日 2012年 9月 14日 コメントはありません

    Raspberry Piからツイートする方法を調べるため、Pythonライブラリのtweepyを試してみます。

    続きを読む »


  • PythonでUSBのパイプを扱う方法

    投稿日 2012年 7月 18日 コメントはありません

    Pinguino(PICマイコンでArduinoのようなことをするもの)について調べていたら、

    http://wiki.pinguino.cc/index.php/Interfacing_with_Python

    にUSBのパイプをPythonで扱う方法が出ていた。

    PinguinoではUSBでホストとのデータ送受信ができるようであり、そのための例として載っている。
    (ちなみにPinguinoは秋月で売っている PIC32MX220F032BのQFP44ピンバージョンであるPIC32MX220F032Dを搭載したバージョンがOLIMEXから販売されている)

    ここによれば、

    On Computer Side

    #!/usr/bin/env python
    #
    import usb
    busses = usb.busses()
    # Search pinguino between all the usb devices
    for bus in busses:
      devices = bus.devices
      for dev in devices:
        if dev.idVendor==0x04d8 and dev.idProduct==0xfeaa:
          pingu = dev
    # Get a device handler for th usb device
    dh = pingu.open()
    # Set configuration 3 an interface 0
    dh.setConfiguration(3)
    dh.claimInterface(0)
    # Read 5 bytes in Bulk mode, convert them to 
    # a string and print it
    while 1 == 1: 
      cadena = ""
      for i in dh.bulkRead(0x82, 5, 10000):
        cadena += chr(i)
      print cadena

    という簡単な記述で扱えるらしい。