読者です 読者をやめる 読者になる 読者になる

Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

Python3.4.0β2を使ってみた

Python Python3 Linux Debian

Python3.4.0Beta2をインストールしたので、早速自分で書いたものをいくつか移植(しようと)してみました。

結論から言ってしまいますと、新機能がいらなくてちょっと使ってみるだけならベータ版ではなく安定版を入れたほうがいいという当たり前の事がよくわかりました。ベータなので当然と言えば当然ですね。

以下、全て前回作成した仮想環境内です。引き続きOSはDebianです。

Webフレームワーク他 - Pyramid, Jinja2, SQLAlchemy -

これらのパッケージは普通にpipでインストールできました。前回、Pyramid+Jinja2の最小構成で試したので、ついでにデータベース(sqlite3)も使ってみました。といいますか元々Python2.7で作ってあったものを使いまわしただけです。print文、文字列関係、相対importの部分を修正するだけで動いてくれました。pytestで書いていたテストも通りました。

文字列のtype判定でisinstance(param. basestring)を使っていたところは全滅でした。basestringはなくなってstrに統一されたんですね。そういう話はどこかで見たことがあったような気がします。

あと、こちらは完全に盲点だったのですが、Pythonの2系と3系で相対importの仕様が変わっていたんですね。3系では相対パスと明示しない限り絶対パスでimportされるそうです。

(参考:Pythonの相対インポートなど - aodag's posthaven

printや文字列はpython3を意識して書いていたのでほとんど修正せずにすみましたが、相対importの件は明示的な相対importとそうでないものが混在していて修正が面倒でした。

とはいえこのあたりの修正だけでpython3.4で動いてくれました。

Flaskも後で試すかもしれません。

テスト - Pytest, nose -

テストフレームワーク(ランナー?)のpytestとnoseは動いているようでした。ただ、noseはなぜかnumpyをインストールする前にnumpyを使ったテストがパスしていました。virtualenvだとインストールされていないモジュールは外から持ってくるんでしょうか・・・?今までは入れ忘れたモジュールはエラーになっていたのですが・・・ちょっとこのあたりよくわかりませんでした。

数値計算、画像処理 - NumPy, SciPy, Matplotlib, Pillow -

NumPyとpillowはpipからインストールできました。scipyは依存パッケージのインストールが必要です。以下のようにパッケージをインストールした後、

sudo apt-get install libblas-dev liblapack-dev gfortran

再度pipでインストールしたら無事にインストールできました。(コンパイル時間長めです)

Matplotlibはpipからのインストールではgccのエラーで止まってしまいました。PyPIにあるバージョンが1.1.1でプロジェクトページにあるソースは1.3.1なので、プロジェクトの方のソースからビルドしてみます。

事前に必要そうなライブラリをインストールします。

sudo apt-get build-dep matplotlib

その後、ソースを展開したディレクトリに移動して(pythonの仮想環境下で)

/[仮想環境へのパス]/bin/python setup.py build
/[仮想環境へのパス]/bin/python setup.py install --prefix=/[仮想環境へのパス]

インストール時にはprefixで仮想環境へのパスを指定しましたが、これは不要かもしれません。この状態で以前書いたmatplotlibやnumpyを使うプログラムのテストをnoseで走らせたところ、全てパスしました。3系に変わったのでエラーがいくつか出るかと思ったのですが・・・なんとなくどこかおかしくなっていそうです。

GUI - PyQt, PySide -

pipではPyQtはインストールできませんでした。依存関係が満たせないなどのエラーでした。とりあえず今回はソースから入れます。

最新のPyQt5はQt5が必要なため諦めてPyQt4にします。これ以上依存パッケージが増えるのは辛いです。

まず、PyQt4の前にsipをインストールします。これもDebian標準のものはバージョンが古かったのでソースからインストールしました。

sipのプロジェクトページからダウンロード→展開し、入れたい仮想環境がアクティブな状態でpython configure.py --helpでデフォルトのパスを確認します。オプションで指定されるパスのデフォルトが-e以外は仮想環境のものになっているはずです。-e(ヘッダファイルのインストール先)だけは/opt/python〜を指定していて書き込み権限無しでエラーになるので、これだけ仮想環境の適当なパスを指定するか、sudoを使って

sudo /[仮想環境のパス]/bin/python configure.py

のような形で実行すれば通るはずです。sudo pythonで実行すると仮想環境ではなく/usr/以下にインストールされてしまうので、仮想環境のpythonを明示的に指定する必要があります。一度--helpオプションをつけて実行し、helpに記載されているデフォルトのパスを確認したほうがいいかもしれません。

その後、

make
make install

で完了です。

私はsudoに怯んで-eで仮想環境のルートを指定しました。/binや/libに並んでsip.hがぽつんと存在するシュールな状態になってしまったので、sudoで/opt以下に入れた方がいいと思います。次のPyQtコンパイル時にこのパスは必要になります。

sipが入ったので次はPyQt4を入れます。これもsipとほとんど同じ流れです。PyQt4のソースを展開し、ディレクトリ内で

python configure-ng.py

と実行します。sipのインストール時に-eオプションでヘッダファイルのインストール先を指定した場合、こちらでも-lオプションで同じパスを指定します。sipの時にsudoを使ったのであれば、今回もsudo /[仮想環境のパス]/bin/python configure.pyにする必要があると思います。

その後、先ほどと同じようにmakemake installで完了です。このmakeはかなり時間がかかりました。

これで何とか使う可能性のある大きめなモジュールは入れ終わった気がします。Pythonの3系に移行できそうな気がしてきました。

今回はかなりやっつけ仕事な上に頭も回ってない感じで、何度か仮想環境をまるごと作り直したりしてました。こういう作業は焦らず落ち着いてやるべきですね。