Category Archives: Python

[Python][Windows] Windows7への純正Pythonインストールメモ

Pocket

ActivePython入れたり純正Python入れたり訳わかんなくなるからメモ。

Pythonのインストール

https://www.python.org/ から2.xでも3.xでもダウンロード、インストール。
アップグレードの場合は、たぶん自分で古いバージョンをアンインストールした方がよい、と思う。
pythoninstallpathadd
インストール時設定は、pythonをpathに追加するところだけ変更した。

pipのインストール

不要ッ!
2.7.9以降、あるいは3.4以降なら最初っからインストールされている。
pip included with Python
実際、デフォルトの状態で以下の通り。

ん?ちょっと古いような?

などとして最新版にした。

[Python] wxGladeでGUIのデザインを

Pocket

Python、Perl、Ruby、PHPなどのLight Languageは、俺みたいな素人プログラマでもじゃんじゃんコードを書けるところが素晴らしい。
さらにそのコードがGUIで動くようになるのなら、もっと素晴らしい。
wxGladeでそれができる。wxGladeでGUIを作ってみたので記す。

wxGladeとは

http://wxglade.sourceforge.net/index.php
wxPython向けのGUIデザイナーである。
wxPythonとはPythonのGUIツールキット。
また、GNOMEのGUIツールキットであるGladeが名前に入っている通り、wxGladeの設計思想はGladeに沿っている。

インストール

こちらからどうぞ。
以下の例ではWindowsを使っている。

最初の一歩

どんなGUIを作るにしても、まず最初にすべきことがある。

起動すると以下のような画面。
wxpyatstart
何のとっかかりもなく、いきなり途方に暮れるわけだが、慌てず騒がず、左上ウインドウのさらに左上にあるアイコンをクリック。
wxpyaddflame
そのままOK。
wxpyMyframe
wxpyaddframedone
なんか枠ができた。
wxpyframewin
そしてこちらを選んで、先ほどの枠に追加。
wxpaneladd
するとこのようなのっぺりした画面に。
basepanel01
あとは分かりやすいように名前を変更。
rootpanel
これで最初の一歩が終了。
ここから、作りたいGUIに合わせて作業をしていく。

作業の前に(日本語は使わないでおこう…)

超絶分かりやすいPythonにも弱点がある。
それは文字コードの扱い。
wxGladeで日本語を書き込むことはできるが、UTF-8なのかShift-JIS(CP932)なのかの扱いが大変に面倒である。
だから、GUI作成時のテキスト、注釈、ボタンは適当な英語で書いておき、実際の処理を書くときに日本語に変えるのがよいと思う。

画面の分割と配置

最終的に以下のようなGUIを作りたいとする。
wxpylast
このGUIは、まず画面を縦に三分割する。さらに1行目、3行目を横に三分割する。
分割にはパレット上の以下のツールで行う。
wxpybunkatsu
ざくざくと分割して以下のように。
wxpyseparate
以下のように便宜的に番号を振って、
wxpynumbers
①にはテキストを、②にはテキストの枠を、③にはボタン、④には横棒、⑤にはスペース、⑥、⑦にはボタンを置く。
wxpyzakkuri
ツリーはこんなかんじ。
wxpyhidarigawa
名前を変更し、空白(スペーサー)は適当に横に伸ばす。
あとは、経験上、各要素を以下のようにするといいかも。
wxpybityousei
wxpylast

書き出し

wxpyapp
Appのプロパティから、LanguageにPython、Output Pathでファイルを指定し、Generate Codeでコード生成。

以下が例。

[Python] pyInstallerの遅さにがっかりしてpy2exeにしたら爆速で驚いた件

Pocket

自作PythonスクリプトをWindows実行バイナリに変換する場合、pyInstallerはとっても楽ちんなのであるが、問題もある。
実行ファイルがスタートされるまで、とても待たされることだ。

その遅さに耐えかねてpy2exeを試してみたところ、ビルドまでは面倒なものの、作成した実行ファイルはめっぽう速くて驚いた。
そういったわけで、py2exeでのWindows実行バイナリ作成方法について記す。

まず最初に、pyInstallerとpy2exeで果たしてどの程度差があるかを示す。

実行速度の違い

UNIX系だと、time; <実行ファイル> とすると所要時間を計測してくれるが、Windowsだとどのようにするのであろうか。
よく分からない。
あんまり興味もないのでWindowsにもあるtimeコマンドで大まかに測ってみた。

前提
・同じスクリプトを使用する
・バイナリは一つにまとめる
・バイナリの処理完了までを測る

結果
・pyInstallerだと5秒
・py2exeだと2秒

その差3秒。
たかだか3MBytesのプログラムでこの違いである。
ただ、py2exeを避けていたのには理由がある。

py2exeの制限

py2exeはバイナリ作成のために、別にsetup.pyを書かねばならない。
対するpyInstallerは、pyInstaller本体に自作スクリプトを引数として与えればいいだけ。こちらからすると面倒ではある。
また、pyInstallerを使っていた時には、特に意識しなかったMSVCR90.dllの考慮もしなければならない。
さらにさらに、エンコーディングにも注意が必要(後述)。

が、これだけの弱点を差し引いても起動時間の差は魅力。
くわえて、setup.pyは一度書いてしまえば使い回しもできるんである。
というわけで、py2exeに宗旨替えを決意した。

py2exe: インストール

http://www.py2exe.org/ から。
ActivePythonであれば、pypm install py2exeでインストールできる。

py2exe: MSVCR90.dllの準備

py2exeでのバイナリ作成、およびバイナリの実行にはMSVCR90.dllが必要。

MSVCR90.dllはファイル名が同じでも複数バージョンが存在する。
悪いことにpy2exeは特定のバージョンを要求する。
そのバージョンが9.0.21022.8。
VisualStudioであれば「SP1でない」2008、あるいはこちらも「SP1でない」Microsoft Visual C++ 2008 Redistributable Package に含まれている。

x86向け
http://www.microsoft.com/ja-JP/download/details.aspx?id=29
x64向け
http://www.microsoft.com/ja-JP/download/details.aspx?id=15336

以下はあくまで参考
x86向けSP1
http://www.microsoft.com/ja-JP/download/details.aspx?id=5582
x64向けSP1
http://www.microsoft.com/ja-JP/download/details.aspx?id=2092

MSVCR90.dll、Microsoft Visual C++ 2008 Redistributable Packageのインストーラ(vcredist_x86.exe)ともに、プロパティからバージョンを確認することができる。

バイナリ作成者がDLL再配布の権利を持っている場合、DLLも含めて自作プログラムを配布できる。
権利がなければ、ユーザには上記のMicrosoft Visual C++ 2008 Redistributable Packageをインストールしてもらうこと。

py2exe:setup.pyって何よ。

py2exeは、バイナリ化じたいの処理を、pythonスクリプトで書く。
自作スクリプトのほかに、setup.pyを書く必要があるのはそのため。

py2exe: setup.pyの書きかた

http://www.py2exe.org/index.cgi/Tutorial

上記チュートリアルに沿って進める。

以下の通りのsetup.pyを作る。
ひとまず自作スクリプトと同じディレクトリが良いでしょう。
もちろん、jisaku.pyは自作スクリプト名に変更。

そうしたら、setup.py, 自作スクリプトのあるディレクトリで、以下のように実行するだけ。

そうすると、同じディレクトリにdistというディレクトリが作られ、その下に実行ファイルができあがる。
簡単である。

あとはこのsetup.pyをベースに、いろいろと加えていけばよい。
py2exeのオプションは以下を参照のこと。
http://www.py2exe.org/index.cgi/ListOfOptions

python setup.py py2exeとタイプするのが面倒

sys.argv.append(‘py2exe’)を加えてあげれば、それ以降”python setup.py”だけでよくなる。

 

実行ファイルを一つにまとめるには

http://www.py2exe.org/index.cgi/SingleFileExecutable

前章で作成したsetup.pyをベースに、といいつつガラッと変わる。
とはいえ、基本的な書式は変わっていない。

bundle_filesでファイルのまとめ方を指定する。
値は1でよい。
1は、とにかく一つにまとめる。
2だと、本体とPython.dllが分かれる。
zipfileもNoneでよい。
ここにファイル名を指定すると、各種DLLがそのファイル名でzipされる。
Noneであれば本体にマージされる。

本体を圧縮するには

速度でpy2exeを選択した私としては、あまり使おうという気にならないのだが。
手元の自作スクリプトから作成した5MBの実行バイナリが3.5MBになった。

 

アイコンを追加するには

icon_resourcesで指定する。
http://www.py2exe.org/index.cgi/CustomIcons

 

実行時にコマンドプロンプトウインドウを開かないようにするには

consoleではなくwindowsにする。

 

py2exeでのエンコーディング

py2exeでホクホクしていたら、スクリプトの実行は問題ないのに、ひとたびpy2exeでバイナリにすると、途端にエンコーディングエラーが出る、という症状に悩まされた。
結論としては、以下を加えれば解決。

http://www.py2exe.org/index.cgi/EvenMoreEncodings
http://d.hatena.ne.jp/shive/20110626/1309061690

[メモ] wxPythonがOS Xにインストールできない(解決)

Pocket

wxPythonはWindows, OS X, LinuxなどOSを問わずGUIアプリケーションを作ることのできる超絶ありがたいツールである。
あるのだが、OS Xにインストールしようとすると、イメージが「壊れているからインストールできません」と来る。
スクリーンショット 2014-09-19 13.40.54
実はこれ、壊れているのではなく、単にサインされていないだけである。
解決法を示す。

システム環境設定の「セキュリティとプライバシー」から「一般」に進み、「ダウンロードしたアプリケーションの実行許可」で「すべてのアプリケーション」を選べばよい。
スクリーンショット 2014-09-19 13.40.09
インストールし終わったら元に戻しておこうな。

http://stackoverflow.com/questions/21223717/install-wxpython-on-mac-os-mavericks

[メモ][Python][SQLite] 巨大なSQLiteデータベースからレコードを取り出すには

Pocket

PythonでSQLiteのデータベースからデータを抜き取るときには何種類か方法がある。

  1. fetchallで一気に取得する方法
  2. fetchoneを繰り返す方法
  3. fetchmanyで数行ずつ取得する方法

である。

fetchoneはダルいから、いままではfetchallを使っていた。
単純に気持ちの問題なんだけれども、根こそぎぶっこ抜いてリストにいったん入れてしまえば、あとはフッツーのPythonで流儀で操作できるからである。
しかし。この方法には問題がある。
fetchallで全部を取り出した先はどこかと言えば、メモリである。
つまり、データベースが巨大になるほど、メモリをバカ食いするわけである。
これはたまらん。

そこで以下のようにする。

データベースから1000行ずつ取り出し、かつ、1行ずつyieldする。
メモリ使用量も抑えて、かつスピードも出る方法である。

元ネタは以下。
Use generators for fetching large db record sets (Python recipe)
http://code.activestate.com/recipes/137270-use-generators-for-fetching-large-db-record-sets/

[メモ] Pythonで標準エラー出力に表示するには

Pocket

sys.stderrを使う。

例1)

例2)

 

http://docs.python.jp/2/library/sys.html#sys.stderr
http://stackoverflow.com/questions/5574702/how-to-print-to-stderr-in-python
https://sites.google.com/site/diveintopythonjp/home/10-sukuriputo-to-sutorimu/10-2-hyoujun-nyuuryoku—hyoujun-shutsuryoku—soshite—era

[メモ] MacにPythonのmatplotlibをインストール

Pocket

matplotlibには、gfortran、freetypeが必要で、こちらはbrewでインストールする。
あとはpipでnumpy, scipyをインストールし、やっとmatplotlibをインストールできる。

gfortran, freetypeのインストール

gfortran。

freetype。libpngも入る。

numpy, scipyのインストール

numpy, scipyのテスト
以下のようなスクリプトを実行

実行結果

matplotlibのインストール

やっとmatplotlib

おしまい。

[Python] 二つのタイムスタンプの差分を計算するには

Pocket

datetimeを使うのが教科書的な回答になるわけだが、ただタイムスタンプってえのは大抵2014/06/20 23:03:58.455118というような書式になっていて、これをどう扱うかがキモ。

そうそう、二つのタイムスタンプの差、というと何かのターンアラウンドタイムとか、もっというと先方からの応答を測るためですね。
諸賢には自明のことであろー。

結論: datetime.strptime()を使う。

datetime.strptimeは与えられたフォーマットにしたがって時刻を構文解析し、datetime型に変換してくれる。
さらにdatetime型どうしで減算すると、timedelta型のオブジェクトが返る。
timedeltaオブジェクトから読み出し専用のインスタンスで日、秒、マイクロセコンドを取り出せばよい(なお時間(Hour)はない)。

 

スクリプト例

お目汚しではありますが例を示す。
Python2.7な。

 

実行結果

上記のスクリプトを実行すると以下のように。

以上。

[メモ] MacにhomebrewでPythonをインストール(virtualenvまで)

Pocket

brewでpythonをインストールする
10.9.3にはPython 2.7.5が入っている。
brewでこれを新しいものに。
またvirtualenvも入れてしまう。

brewでインストール

すっ飛ばした途中にいろいろと重要なことが表示されている。
すなわち、Pythonのインストールに必要なソフトウェアはOS Xにもあるけど、いろいろと問題もあるから新しいの入れとくわなどなど。
また、pipとsetuptoolsもインストールされている。

いずれにせよpythonのインストールはできた。
ターミナルで調べてみると2.7.6に変化していますね。

そのままvirtualenvなどのツールをインストール。

virtualenvのインストール

pipでインストールするだけ。

PyInstallerで作ったWindowsアプリでバージョンを表示させたい(Version Resource Fileの作りかた)

Pocket

Windowsアプリケーションのバージョンは、そのプロパティから確認できる。
PyInstallerでWindowsアプリケーションを作るときにも、ぜひここに登録をしたい。

PyInstallerでは、あらかじめ用意しておいたVersion Resource Fileを読み込ませることで、バージョンなどの情報をアプリケーションに書き込むことができる。

しかし、その方法はちょっとトリッキーなので、ここにその方法を採録する。
トリッキーな内容は何かというと。
要するにVersion Resourceをスクラッチで書くのは大変なので、そのへんにあるWindowsアプリケーション(厳密には拡張子が.exeの実行ファイル)から抜き出してきてそれを使い回すというもの。
れっきとした公式手順である。
したがって全体の流れは以下のようになる。

全体の流れ

1.「既存の」WindowsアプリケーションからVersion Resourceを抜き出す。
2.抜き出したファイルを書き換え。
3.そのファイルを指定してPyInstallerを実行

Version Resourceファイルの抜き出し

PyInstallerには、pyi-grab_version.pyというスクリプトが含まれている。
PyInstallerを展開してできるutilsディレクトリの下にある。
お使いのWindows上にある実行ファイルを引数に与えてpy-grab_version.pyを実行すればよい。
結果はpy-grab_version.pyと同じディレクトリにfile_version_info.txtとして書き込まれる。

以下はWindows 7のcmd.exeを引数に与えた場合の実行例である。

以下が書き出されたfile_version_info.txt。
UTF-8なので注意。

次は本ファイルを書き換える。

ファイルの書き換え

cmd.exeのプロパティ->詳細タブと見比べながら書き換えていけばよい。
それ以外は触らないこと。
cmdexeproperty
たとえばこんな感じ。

ファイルの準備はおしまい。
あとはビルドの際にファイルを指定するだけ。

Version Resourceファイルを指定してビルド

単純に–version-file=<ファイル名>と指定するだけ。
だから実行例は省く。
pyhogeversion
無事に表示された。

補足

参考までに公式の宣言、つまりVersion Resourceは複雑すぎマジ無理、と言っている箇所を貼り付けておく。

because version resources are complex. Some elements are optional, others required. When you view the version tab of a Properties dialog, there’s no simple relationship between the data displayed and the structure of the resource. Using pyi-grab_version you can find an executable that displays the kind of information you want, copy its resource data, and modify it to suit your package.