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個インストールされました。この状態でとりあえず./comfigure
とmake
してみましたが、以下のモジュールが見つからないと怒られました。
_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 --version
やpython3 --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のベータ版を試すくらいはできそうです。