PPP3:Webアプリと見せかけて
さてこのへんで1章を終わって
Chapter 02 Webアプリケーションを作る
知識パートはさらっと読んでと
CGIから書いてる
そういうの好き
#!/usr/bin/env python3.6
っていうShebangを書くことになっているけど
Windows版ではどうするものだろうか
python3.6
で実行できるようにしてないしそもそも3.6入れてないし
そもそもそもそもShebangが動作に影響するのかどうか
試すならやっぱり違うバージョンのPython入れてみたいなあ
入れるか
仮想マシン側にあわせて3.6.4にしよう
新しいのが入ってるところに古いのを入れるっていうのがちょっとひっかかるけど
多分大丈夫だと信じて
Add Python3.6 to PATHはオフになってる
そのままにする
3.7はPATHに入れてて、ふたつもPATHに入ったらおかしい気がするので
py launcherにチェックが入ってて外せないのはもう3.7用が入ってるからかな
結局設定はデフォルトのまま進めた
py launcher(py.exe)は複数のpythonがインストールされていても
いい感じのバージョンを選んでくれるプログラム
単にpy hoge.py
と呼び出せば(インストールされている中で)最新の
pythonで実行され
py -2 hoge.py
、py -3 hoge.py
ならそれぞれpython2、python3の
最新で実行される
py -3.6
といった指定も可能
詳細はpy -h
で
このとき、実行されるpythonはPATHに入っている必要はないもよう
どういう仕組みなのかちゃんとpy.exeが見つけてくれる
py自体はWindowsフォルダに入るので改めてPATHを設定する必要もない
あとpy.exeを.pyに関連付けするという使い方もある
しかしpy.exeはWindows上でしか使えないので
LinuxやMacと共有するスクリプトのShebangには使えない
Shebangがどう使われるかちょっと試してみる
まずはShebangなしのこういうので
import sys
print(sys.version)
>pyver.py
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]
こいつ・・・動くぞ(実は動かないと思っていた
なんで動くんだっけ
コマンドプロンプトも関連付けとか見てくれるんだっけ
へー
見てくれるんだな
知らんかった
PATHEXTっていう環境変数を設定すると、拡張子を省略しても起動できるらしい
>pyver
'pyver' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
>set pathext
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
>set pathext=%pathext%;.py
>pyver
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]
ほんとだ
さらに
関連付けもコマンドプロンプトで確認・操作できるのかー
>assoc .py
.py=Python.File
>ftype Python.File
Python.File="C:\Windows\py.exe" "%L" %*
しらんかったわー
さて本題に戻ってこんどはGit Bash
$ ./pyver.py
./pyver.py: line 1: import: command not found
./pyver.py: line 2: syntax error near unexpected token `sys.version'
./pyver.py: line 2: `print(sys.version)'
これは当然
こんどはShebangつけてみる
まずはプレーンにpython
を指定して
#!/usr/bin/env python
import sys
print(sys.version)
どれどれ
>pyver.py
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]
$ ./pyver.py
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]
両方成功したな
実行されるのは最新のpython
コマンドプロンプトのほうは、関連付けでpy.exeが起動して
py.exeがShebangをなにやら解釈してるんだろう
/usr/bin/env
は無視してるのかと思ったけど#!/usr/bin/envenv python
って
してみたらUnable to create process using ‘/usr/bin/envenv python “D:3.py”’
って言われた
ちゃんと起動しようとしてるのか
じゃあGit Bashとか入れてない環境だったらどうなるの
py.exeにもPEPがあった
PEP 397 – Python launcher for Windows | Python.org
“Shebang line parsing”の項に説明がある
The launcher will define a set of prefixes which are considered Unix compatible commands to launch Python, namely “/usr/bin/python”, “/usr/local/bin/python”, “/usr/bin/env python”, and “python”.
Otherwise the command is assumed to be directly ready to execute
“/usr/bin/python”とか“/usr/local/bin/python”とか“/usr/bin/env python”とか“python”なら
py.exeがいい感じにやってくれて、そうじゃなければCreateProcessにそのまま渡されるってことらしい
実験
notepad.pyという名前で#!notepad.exe
と書いただけのファイルを作って実行
おお、メモ帳にnotepad.pyが読み込まれた
バカ実験はそれくらいにして本題(すぐ逸れる
#!/usr/bin/envenv python3.6
import sys
print(sys.version)
>pyver.py
3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
$ ./pyver.py
/usr/bin/env: ‘python3.6’: No such file or directory
あーそうですね
シンボリックリンク張ってないから
Git Bashだとln -s
が使えるんだっけ?
コマンドはあるな
そしてどこに?
py.exeに合わせてWindowsフォルダにでも作るかな
$ ln -s /c/Users/takahiro/AppData/Local/Programs/Python/Python36-32/python.exe /c/windows/python3.6
ln: failed to create symbolic link '/c/windows/python3.6': Permission denied
守られた
$ sudo ln -s /c/Users/takahiro/AppData/Local/Programs/Python/Python36-32/python.exe /c/windows/python3.6
bash: sudo: command not found
sudoはなかった
$ runas /user:koba925@gmail.com "ln -s /c/Users/takahiro/AppData/Local/Programs/Python/Python36-32/python.exe /c/windows/python3.6"
koba925@gmail.com のパスワードを入力してください:
ln -s /c/Users/takahiro/AppData/Local/Programs/Python/Python37-32/python /c/windows/python3.6 をユーザー "koba925@gmail.com" として開始しています...
$ ls /c/Windows/py*
/c/Windows/py.exe /c/Windows/pyshellext.amd64.dll /c/Windows/pyw.exe
できてねえ
Git Bashを管理者で実行してからやってみる
$ ln -s /c/Users/takahiro/AppData/Local/Programs/Python/Python36-32/python.exe /c/windows/python3.6
$ ls -l /c/Windows/py*
-rwxr-xr-x 1 takahiro 197609 907792 3月 25 21:28 /c/Windows/py.exe*
-rwxr-xr-x 1 takahiro 197609 60944 3月 25 21:30 /c/Windows/pyshellext.amd64.dll*
-rwxr-xr-x 1 takahiro 197609 97944 12月 19 2017 /c/Windows/python3.6*
-rwxr-xr-x 1 takahiro 197609 908304 3月 25 21:28 /c/Windows/pyw.exe*
お、できてる
$ python3.6
C:/Windows/python3.6: error while loading shared libraries: ?: cannot open shared object file: No such file or directory
だめ
コマンドプロンプトからやってみるとpython36.dllが見つからないって言う
シンボリックリンク張るだけじゃダメってことか
>dir c:\windows\py*
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 10EF-0936 です
c:\windows のディレクトリ
2019/03/25 21:28 907,792 py.exe
2019/03/25 21:30 60,944 pyshellext.amd64.dll
2017/12/19 06:08 97,944 python3.6
2019/03/25 21:28 908,304 pyw.exe
第一この表示だとシンボリックリンクじゃなくてただのコピーなんじゃ
Git Bashをあきらめて管理者でコマンドプロンプトを起動して
C:\Windows\system32>mklink c:\windows\python3.6.exe c:\Users\takahiro\AppData\Local\Programs\Python\Python36-32\python.exe
c:\windows\python3.6.exe <<===>> c:\Users\takahiro\AppData\Local\Programs\Python\Python36-32\python.exe のシンボリック リンクが作成されました
C:\Windows\system32>dir c:\windows\py*
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 10EF-0936 です
c:\windows のディレクトリ
2019/03/25 21:28 907,792 py.exe
2019/03/25 21:30 60,944 pyshellext.amd64.dll
2019/05/03 20:59 <SYMLINK> python3.6.exe [c:\Users\takahiro\AppData\Local\Programs\Python\Python36-32\python.exe]
2019/03/25 21:28 908,304 pyw.exe
4 個のファイル 1,877,040 バイト
0 個のディレクトリ 408,865,828,864 バイトの空き領域
Windowsでシンボリックリンクといえばこれでしょう
しかし実行してみるとやはりpython36.dllが見つからないって言う
3.7のほうでやってみたらどうなるだろう
C:\Windows\system32>mklink c:\windows\python3.7.exe c:\Users\takahiro\AppData\Local\Programs\Python\Python37-32\python.exe
c:\windows\python3.7.exe <<===>> c:\Users\takahiro\AppData\Local\Programs\Python\Python37-32\python.exe のシンボリック リンクが作成されました
C:\Windows\system32>python3.7
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
できた
パスが通ってればいけるのかな?
C:\Windows\system32>path %path%;C:\Users\takahiro\AppData\Local\Programs\Python\Python36-32\
C:\Windows\system32>python3.6
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
なんかいけちゃったな
そんなもんか
ところでみなさんお気づきでしょうが
3.7も3.6も32ビット版インストールしてしまってますね
何も気にしてなかった
これを機に64ビット版に入れ替えます
パスを通して
あと、AppData
c:
vscodeの設定とかどうなってるかな
あ、Python is not installedとか言ってる
けどPython 3.7.3 64-bitとか3.6.4 64-bitとか見つけてるじゃない
起動しなおしたら消えた・・・みたい
C:\Windows>mklink c:\windows\python3.6.exe c:\Python\Python36\python.exe
c:\windows\python3.6.exe <<===>> c:\Python\Python36\python.exe のシンボリック リンクが作成されました
C:\Windows>mklink c:\windows\python3.7.exe c:\Python\Python37\python.exe
c:\windows\python3.7.exe <<===>> c:\Python\Python37\python.exe のシンボリック リンクが作成されました
C:\Windows>python3.6
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
C:\Windows>python3.7
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()
C:\Windows>python3.7
大丈夫
えーとなにやってたんだっけ
そう
Shebang
>pyver.py
3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]
$ ./pyver.py
3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]
やっとできた
3.7も問題なく起動
CGIのスクリプトも起動
python3.6 -m http.server
でHTTPサーバが起動するのか
へー
--cgi
オプションでCGIを実行するというわけね
なるほど
問題なし
共有フォルダを使って仮想マシン側でもやってみる
ん
表示されない
なんだ
192.168.33.1 - - [03/May/2019 12:57:53] "GET /cgi-bin/hello.py HTTP/1.1" 200 -
/usr/bin/env: ‘python3.6\r’: No such file or directory
あーなるほど
改行コードね
LFにしとかないとね
うん成功
vscodeのデフォルトをLFにしておこうかなあ
不具合出たりするかなあ