kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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.pypy -3 hoge.pyならそれぞれpython2、python3の
最新で実行される
py -3.6といった指定も可能
詳細はpy -h
このとき、実行されるpythonはPATHに入っている必要はないもよう
どういう仕組みなのかちゃんとpy.exeが見つけてくれる
py自体はWindowsフォルダに入るので改めてPATHを設定する必要もない
あとpy.exeを.pyに関連付けするという使い方もある

しかしpy.exeはWindows上でしか使えないので
LinuxMacと共有するスクリプトShebangには使えない

Shebangがどう使われるかちょっと試してみる

まずはShebangなしのこういうので

import sys
print(sys.version)

コマンドプロンプトとGit Bash両方でやってみよう

>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にしておこうかなあ
不具合出たりするかなあ