[play1] play1.7系でついにpython3へ

  playframework1

Pythonが同梱されなくなる

playframework1ではplayアプリケーションを管理するために沢山のスクリプトがpythonで書かれています。JavaVMの起動の遅さ、OSに関わる処理のやりにくさなどの理由でJavaではなくPythonを採用したそうです。

PythonはOS依存せず高速動作し書きやすいですが、残念ながらWindowsには標準でインストールされていません。そこでplayframeworkではpythonも一緒に同梱するアプローチを採っています。

で、今まで同梱されてたpythonのバージョンは2系でした。(現在のpythonは3系に主流が移っていますが、playframework1が誕生したのは2007年頃ですのでこれは仕方ないことですね。)

play1.7.0からはpythonで書かれたスクリプトがすべてpython3対応されるとともに、python2の同梱も廃止となりました。

Windows環境ではPython3のインストールが必要

pythonがバンドルされなくなったので windows環境で使用する場合はまずpython3をインストールしなくてはなりません。

Python Releases for Windows | Python.org
https://www.python.org/downloads/windows/

このあたりから自分に合った版を選んでインストールすればいいです。pipでモジュール管理するのであれば素直にインストーラを用いるのがいいと思います。

今まで同梱Pythonがあったフォルダには代わりに requirements.txt というファイルが置かれています。これは依存しているモジュールを記したファイルなので、これを引数にして pip経由でモジュールを追加しましょう。

C:\> py -m pip install -r play-1.7.1\python\requirements.txt

また、これとは別に windows環境の場合は pywin32 というモジュールも必要なようです。インストールされていないと下記のようなエラーが出ます。

No module named 'win32pdh'
  File "C:\play1\bin\play-1.7.1\framework\pym\play\commands\daemon.py", line 14, in <module>
    import win32pdh, win32pdhutil
ModuleNotFoundError: No module named 'win32pdh'

直接 pywin32 を指定してインストールします。

C:\> py -m pip install pywin32

プロキシ経由するとき

pip.ini経由でプロキシ設定したりする方法もありますが、私は環境変数を用いた方法を使いました。

SET HTTP_PROXY=http://user:pass@192.168.0.10:8080
SET HTTPS_PROXY=http://user:pass@192.168.0.10:8080

最後に

python3が正しくインストールされていればお馴染みの画面が表示されるはずです。

C:\play1\workspace>play
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/
~
~ play! 1.7.1, https://www.playframework.com
~
~ Usage: play cmd [app_path] [--options]
~
~ with,  new      Create a new application
~        run      Run the application in the current shell
~        help     Show play help
~

おまけ

モジュールにも command.py というスクリプトがあります。そのため play-1.7系ではそのままでは動かなくなっています。play deps 直後にエラーを吐いちゃったり。。

~ !! Error while loading C:\play1\workspace\aaaa\modules\launcher-0.1.1\commands.py: Missing parentheses in call to 'print'. Did you mean print(…)? (commands.py, line 23)
~

モジュール側でのPython3対応が期待できない場合は、Python に付属していある 2to3.py というスクリプトを用いてPython3対応が簡単に行えます。

LEAVE A COMMENT