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:\> 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:\> 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
~
import imp 問題
impライブラリは python3.4から非推奨になっていて、python3.12で削除されたそうです。
The imp module was removed from python 3.12 · Issue #1457 · playframework/play1 (github.com)
/opt/hostedtoolcache/play-1.7.1/play deps --verbose --sync --forProd
Traceback (most recent call last):
File "/opt/hostedtoolcache/play-1.7.1/play", line 13, in <module>
from play.cmdloader import CommandLoader
File "/opt/hostedtoolcache/play-1.7.1/framework/pym/play/cmdloader.py", line 2, in <module>
import imp
ModuleNotFoundError: No module named 'imp'
make: *** [Makefile:68: deps] Error 1
修正は 1.8.0 に対して行われているようなので、1.7系で対処したい場合は以下の差分を参考にcmdloader.py, modulesrepo.py を自前で修正しましょう。
#1457 python imp module by xael-fry · Pull Request #1465 · playframework/play1 (github.com)
おまけ
モジュールにも 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対応が簡単に行えます。