RSS2.0

python の pip でインストールできる自作モジュールを作ってみる

Java にはライブラリの依存性を管理するためのつーるとして Maven や Gradle がありますが、Python の世界にもパッケージ管理ツールとして pip があります。コードの規模が大きくなってくるとモジュール化は避けては通れない課題なので、今回は pip を使って、Python での自作モジュールの作成と呼び出しをしてみようと思います。

自作モジュールを用意する

まずは作業をするための自作モジュールのディレクトリを作り、その中に移動します。ディレクトリはなんでもいいですが、わかりやすいようモジュール名と同じにしておきます。
$ mkdir libhollow
$ cd libhollow

このディレクトリ内に、自作モジュールのためのファイルを用意します。
ディレクトリ内に、さらにモジュール名と同じディレクトリを作成します。
$ cd libhollow
そしてこのディレクトリ内部に __init__.py を作成します。中身は空でよいので touch コマンドで作ります。
$ touch libhollow/__init__.py
同じくモジュールに含める Python のコードも入れておきます。ここでは libhollow/jackolantern.py というファイル名で、以下の Python コードを置いておきます。
# -*- coding: utf-8 -*-

def call():
    print "Trick or Treet"
Python コードの内容としては、"Trick or Treet" と表示される call() を定義しているだけです。

ここまで見てくると、これが通常の Python パッケージの作りかたと同じであることに気づくかもしれません。Python に、sys.path 上にあるパッケージを import させるには、まずパッケージ名のディレクトリを作ってソースコードを置き、いっしょに __init__.py もいれておく必要があります。pip でインストールできる自作モジュールを作る際にも、モジュールのコードや __init__.py は同じようにモジュール名のディレクトリ内部に置いておくことになります。
続きを読む python  コメント (0)  2018/11/02 13:02:57

ImageMagick6 を Fedora 26 にインストールする

諸事情により Fedora 26 で ImageMagick を使える環境を用意することになりました。
普通だったら yum install して終わりなのですが、リポジトリに上がっているのはインストールしたい ImageMagick6 ではなく、ImageMagick7 のようでした。
なのでソースからビルドしてみたいと思います。

jpg, png モジュールをインストールする

ImageMagick6 本体をビルドしただけでは、取り扱う画像フォーマットが限定されています。jpg や png を扱えない…というより、ほとんどの画像フォーマットが使えないようです。画像フォーマットのデコーダー等は ImageMagick 本体には含まれておらず、自分で用意してくれということなのだと思います。画像フォーマットのライセンスやらもいろいろ事情がありそうです。

そこで、ImageMagick6 をビルドする際に必要な画像フォーマットのパッケージをインストールしておきます。
以下は jpg, png に関するパッケージです。devel パッケージもインストールしておくことに注意してください。
# yum install libjpeg libjpeg-devel
# yum install libpng libpng-devel

Wand の画像フォーマットエラー

jpg, png に関するパッケージをインストールしておかないと、いざ ImageMagick6 を使おうとした時にエラーになります。
python から ImageMagick6 を使える Wand では、以下のようなエラーが発生します。
Traceback (most recent call last):
  File "wandtest.py", line 4, in <module>
    with Image(filename='sample.jpg', format='JPEG') as img:
  File "/home/momokan/python/wand/wand/image.py", line 2744, in __init__
    self.read(filename=filename, resolution=resolution)
  File "/home/momokan/python/wand/wand/image.py", line 2822, in read
    self.raise_exception()
  File "/home/momokan/python/wand/wand/resource.py", line 222, in raise_exception
    raise e
wand.exceptions.MissingDelegateError: no decode delegate for this image format `JPEG' @ error/constitute.c/ReadImage/504
Exception TypeError: TypeError("object of type 'NoneType' has no len()",) in <bound method Image.__del__ of <wand.image.Image: (empty)>> ignored

ImageMagick6 をインストールする

ソースコードは github に上がっています。なのでこれを持ってきましょう。
$ git clone https://github.com/ImageMagick/ImageMagick6
そうしたら clone した ImageMagick6 ディレクトリに移動し、configure, make, make install します。
この辺りのビルドの仕方は伝統的な C プログラムですね。
$ cd ImageMagick6
$ ./configure
$ make
# make install
configure のオプションにインストールディレクトリなんかもあるはずなのですが、面倒なので特に指定していません。指定しない場合には /usr/local/lib に共有ライブラリ(.so ファイル)がインストールされます。
続きを読む WEB 技術python  コメント (0)  2018/05/07 16:41:26

Python nose でユニットテストを書いてみた

chocolablog は Python で書かれていますが、これまであまりユニットテストの整備に時間を割いてこれませんでした。しかし初期バージョンの開発から 2 年以上が経ち、その間に何度か sqlite3 をとりまく DB アクセス部分を中心に、処理を書き換えています。他のロジックはともかく、コアとなるコードはしっかり動作を担保しておくべきだなと感じ、ユニットテストの整備に着手することにしました。

nose_report.png
Python では 2.1 移行、ユニットテストフレームワークとして unittest が組み込まれています。これは個人的に大好きな JUnit をベースに作られているそうです。ただネット上で目にした Python 系のオープンソースプロジェクトでは、この uniittest モジュールではなく nose というモジュールを使ってテストコードが書かれていました。nose を使うとテスト失敗時にデバッグツールの pdb を自動で起動してステップ実行ができたり、ソースコードのカバレッジレポートを出力できたりと、テストの書き方以外の面でもいくつかメリットがあります。
今回は unittest よりさらに簡単にユニットテストを書けるらしい nose を使い、ユニットテストを書いてみました。

続きを読む python  コメント (0)  2014/05/29 08:02:50

MeCab の IPA 辞書を再学習させてみる

MeCab の辞書は利用する分野に応じて、新たな名詞や動詞などを追加したり、その分野の文章の解析精度を上げるよう再学習させることができます(この作業はドメイン適応と呼ばれるそうです)。

ドメイン適応の第一歩としては、未知の名詞の MeCab 辞書への登録から始めると良いです。
ただ登録作業自体は、辞書をビルドする際に、その単語を後述のフォーマット(※1)で書いた .csv ファイルを混ぜておけばいいので、それほど難しいことではありません。問題となるのはその単語がどの程度使われやすいのかを調整する必要があることです。この使われやすさを示す数値はコストと呼ばれ、単語を登録する際には自分で決め打ちしなければなりません。

コストの手動計算方法はネット上でもいくつか紹介されていますが、手動計算ではあまり複雑な計算はできないので、同じ品詞のコストが同じ値になりがちです。そこでもう少し踏み込んだコスト算出方法として、辞書の再学習という手段があります。これは既存の辞書を作る際のデータモデルと追加する単語、少量の例文からコストや単語の接続方法を自動判定させる機能です。

続きを読む MeCabpython  コメント (0)  2013/04/21 20:09:28

MeCab の IPA 辞書を UTF8 化する

配布されている MeCab の IPA 辞書は、文字コードが EUC JP になっています。
辞書のビルド時に文字コードを指定できるので、ちょっと試してみる分にはいいのですが、単語を登録しようとしたり、再学習をさせようとすると、文字コードが統一されていないことは障壁になります。

そこで MeCab 推奨の IPA 辞書を UTF8 に変換するツールを書いてみました。
テキストファイルの文字コードを変更するだけなのでシェルスクリプトでもできますが、個人的にのちのち再利用できそうなので python を使っています。

続きを読む MeCabpython  コメント (0)  2013/04/19 22:46:59

Linux 環境でマルチコア CPU を利用した python プログラムを書く

マルチコア CPU を利用した python プログラム、と言っても、Linux 環境ではプロセス単位で CPU が割り当てられるので、つまりはマルチプロセスを意識したプログラミングになります。

java でマルチコア CPU を利用しようとするとマルチスレッドで実現することになりますが、python の場合はわかりやすく別プロセスで実現されているため、ps や top コマンドで見えて面白いです。

python ではマルチプロセス用に multiprocessing モジュールが用意されていますが、今回はひとまず古典的な fork() 関数を使い、実際に複数のプロセスがマルチコア CPU によって処理されている様子を見てみたいと思います。

どちらかというと新人さん向けのプロセスのお話になってしまいましたが、季節柄ということで。
続きを読む Linuxpython  コメント (0)  2013/04/16 19:42:27

igo-python を使ってみた

前回 MeCab をちょろっと触ってみましたが、バイナリをビルドして、となるとコンソールが使えないレンタルサーバーでは使いづらいのが実情です。形態素解析器で C 言語じゃないものは他に何があるんだろうと探してみたところ、Igo という、Java の形態素解析器が見つかりました。

Igo はソースコードこそ異なるものの、解析結果は MeCab 互換となることを目指して作られたもので、辞書ファイルのフォーマットも MeCab のものに合わせているそうです。(ただ、未知語の扱いについては MeCab との差異があるようなので、公式ページを確認してください。)

今回は、この Igo を更に Python に移植したという igo-python を使ってみました。形態素解析を組み込もうかと思っている chocolablog が Python 製なのが理由です。
続きを読む MeCabpython  コメント (0)  2013/04/11 07:42:15
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2018, 12>>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345