Blank File

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

Python3.4.0β2をインストールしてvirtualenvで使うまで

DebianにPython3.4(beta2)をソースからビルドしてインストールしてみたので作業メモとして残しておきます。

動機

PythonはPython2.7を使っていましたが、そろそろ大手モジュールのpython3対応が出揃ってきたのでPython3系を使ってみようかと。

ところが、手元のDebian (wheezy) に入ってるのは3.2という悲しい現実。3.2と3.3では色々と変更(Unicode使うときのu'あいう'が3.3で復活など)があるので、今更3.2を使うのは個人的にはなし。

どうせメインで使うわけではないので、思い切って最新のベータ版(3.4.0b2)を試すことにしました。

ソースコードここから持ってきて入れます。ベータ2なのでそれなりに動いてくれることを期待して・・・手順は基本的にここここの説明に沿って進めます。

環境はDebian 7.3 (wheezy) 64bitです。設定はUbuntu風でrootユーザを使わずにsudoとか使っています。

ソースコードのダウンロードと依存パッケージのインストール

Pythonのダウンロードページから適当なファイルをダウンロードして適当なフォルダに展開します。私はPython-3.4.0b2.tar.xzを使いました。

基本的にはCのコンパイラさえ入っていればコンパイルできるらしいです。しかし、外部ヘッダーやライブラリに依存している拡張モジュールもあるらしいので、必要なパッケージをまとめてインストールしておきます。

sudo apt-get build-dep python3

これで必要なパッケージが入るそうです。私はlib〜が7個インストールされました。この状態でとりあえず./comfiguremakeしてみましたが、以下のモジュールが見つからないと怒られました。

_bz2 _dbm _gdbm _lzma _tkinter

対応していそうなパッケージをインストール。

sudo apt-get install libbz2-dev libdb-dev libgdbm-dev liblzma-dev tk-dev

いくつかライブラリの名前がわからず調べているとき、こちら(Python開発環境 - aodag memo)の記事を見つけました。私がやりたかったことはほとんど書いてありましたが、ここまで書いてしまったので最後まで書きます。

さて、ひと通り環境は整ったはずなので再度挑戦。上手くいけばそのままインストールまで進めたいので、今回は--prefixオプションでインストール先を指定しておきます。ベータ版に既存環境を置き換えられるのは怖いですから。

./configure --prefix=/opt/python3.4.02b
make

これで一応最後まで走りました。いきなりインストールするのは気が引けたので、試しにその場で起動してバージョン確認。

./python --version
Python 3.4.0b2

大丈夫そうです。ついでに簡単に動作確認。

./python
>>> print 'a'
  File "<stdin>", line 1
    print 'a'
            ^
SyntaxError: invalid syntax
>>> print('a')
a
>>> print(u'a')
a
>>> print(u'あ')
あ

ちゃんとprint文がエラーになってprint式だけが動作してますね。さらにUnicodeリテラルu'あ'とかもエラーにならず表示できてます。Python2系からのコードの移植とか考えるとこの変更は大きいと思います。

インストール

一応は動作したので意を決してインストールします。

sudo make install

インストール後にpython --versionpython3 --versionで確認するとそれぞれ2.7.3と3.2.3だったので、既存の環境には影響を与えてなさそうです。

今回インストールしたpythonは/opt/python3.4.0b2/bin/python3.4で起動できます。binの手前までは--prefixで指定したパスです。virtualenvで使うならこれで十分ですね。

virtualenvで使ってみる

virtualenvはインストールされている前提で。virtualenvはpython2系でpip install virtualenvでインストールされているもので大丈夫です。わざわざ3.4でpipやvirtualenvをインストールする必要はありません。

適当なディレクトリでpythonの実行パスを指定して仮想環境を作ります。

virtualenv -p /opt/python3.4.0b2/bin/python3.4 --no-site-package py3env
cd py3env
source bin/activate
python --version

これでバージョンが先ほどインストールしたものと同じ(3.4.0b2)ならOK。(仮想環境から抜ける時はdeactivate

おまけ

仮想環境以外でもpython3.4とかで実行できるようにする方法。今回はベータ版ですが、後々安定版のソースから入れて頻繁に使うような時のために試してみました。

といってもほとんどすることはなく、~/.bashrcや~/.zshrcあたりでPATHに追加するだけです。

export PATH=$PATH:/opt/python3.4.0b2/bin

これで端末を再起動してpython3.4で呼べました。既存PATHの後ろに追加したのは、同じbinディレクトリにあるpython3シンボリックリンクが既存のpython3を上書きすることを避けるためです。python3 --versionで確認したところ、変わらず3.2.3だったので問題なさそうです。

おまけ2

せっかく仮想環境作ったので何か試してみます。webフレームワークのPyramidがPython3系に対応してるはずなのでプロジェクトを作って動かしてみます。

仮想環境で、

pip install pyramid
bin/pcreate -s starter MyProject
cd MyProject
../bin/python setup.py develop
../bin/python setup.py test -q
../bin/pserve development.ini

テストも通ってすんなりサーバーも立ち上がって一見無事かと思いきや、ブラウザでアクセスしたらエラーになりました。

  File "/.../py3env/lib/python3.4/site-packages/chameleon/astutil.py", line 279, in visit
    node.__class__.__name__, repr(node)))
Exception: No handler for ``NameConstant`` (<_ast.NameConstant object at 0x7f6d80b73c50>).

chameleonからエラー出てますが、他でも出そうなエラーですね。ベータ版だから仕方ないですね。テンプレートエンジンをjinja2に変更したらエラーは出ませんでした。お試しで使うくらいはできそうです。

一応、元から入ってるPython3.2でも試してみました。こちらはpyramidの(というかchameleonの)インストール中からエラー出てました。u''を使っているところが原因でした。こちらもテンプレートエンジンをjinja2に変えたら動きました。Chameleon・・・

ちなみにchameleonのバージョンは2.14で、以下のようにPython3.2もOKなはず。

You can use it in any Python web application with just about any version of Python (2.5 and > up, including 3.x and pypy). (Chameleon 2.14より)

最後に若干残念な感じになってしまいましたが、3.4のベータ版を試すくらいはできそうです。