Pythonの実行環境を構築してみた
最近、何気に耳にすることが多くなったPythonなるコンピュータ言語の実行環境を構築してみた。
(冒頭の写真は、'Python'の語源である’大蛇’をイメージして、浜大津港の花噴水です。こころは、”とにかく大きくて、長い”、まるで大蛇!)
きっかけの記事はこちら
Ayumiさんの記事で、はじめてPythonのソースコードを見た。
ふんふん、、、
ソースコードをパッと見してc言語だと勘違いし、
それにしても変数定義なしでいきなり値を代入したり、
printf()じゃなくてprintって、Basic言語みたいだなとは思ってたんですけど。
ひょっとして、c言語にそんな技があったのか?!
、、、で、main()はどこ?
と、相変わらず頓珍漢な疑問。
、、、そうだった、C言語じゃなかった。(記事のタイトルにもはっきりPythonって書いてあったし💦)
どうりで、kznさんに教えていただいた、『ブラウザで動く C言語実行環境」 にコピペしたらエラーが出るんだ😅
こんなことだから、オランダでオランダ人にドイツ語で挨拶していて気づかなかったり、日本人に日本語で会話しているつもりで英語で喋ったりしちゃうんだな。
、、、どうも、頭の切り替え速度が遅くなっているようです。
別物と認識するためには、ちゃんと環境をわけてみるようにしないといけないようです。
、、、というわけで、Pythonの実行環境を構築します。
参考にしたのはこちらのサイト
・macOSが搭載されたPC(macOS 10.15 Catalina以降)
システム設定で確認したら、macOS Sonoma version14.4.1だった。
最低要件として書かれたバージョンよりも随分と最新なので、少し心配だが、絶対ダメと言われたわけではないのでやってみることにする。
・テキストエディタ
記事では、"Visual Studio Code(VSCode)"がお勧めされていたけど、とりあえずはMac標準の"テキストエディット"を使うことにする。
(このアプリは、デフォルトではリッチテキストで保存しようとするし、ファイル名の拡張子に強制的に'.txt"とつけてくれるのが鬱陶しいが、なんとかならないものか。)
・Pythonの基礎的な知識
これについては、(前述のとおり)まったく持ち合わせていない。
これからおいおい、習得していこうと思う。
環境構築開始
①pythonが、既にインストールされていないかをチェック
jm3nrhMac-mini-:~ akio$ python --version
-bash: python: command not found
、、、無いようです。
Homebrewのインストール
②Homebrewの有無をチェック
Pythonをインストールする手法として、pyenvというツールを使う方法があり、そのためにはHomebrewというツールが必要らしい。そこで、このツールのインストール状況をチェックする。
jm3nrhMac-mini-:~ akio$ brew -v
-bash: brew: command not found
、、、無いようです。
③Homebrewをインストールする
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
==> Checking for `sudo` access (which may request your password)...
Password:
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
、、、途中で、パスワードの入力を求められます。
なにやら危ないことをしている自覚はあるのですが、覚悟を決めて処理を続けます。
//(約450行省略)
==> Installation successful!
うまくいった(?)ようです。
④さらに、M1搭載のMacの場合、次のコマンド実行が必要なのだそうです。
jm3nrhMac-mini-:~ akio$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
jm3nrhMac-mini-:~ akio$ source ~/.zshrc
何をしているのかは、さっぱりわかりません。
⑤Homebrewの有無を再度チェック
jm3nrhMac-mini-:~ akio$ brew -v
Homebrew 4.2.19
参考としたサイトの表示例とバージョン番号が違うようですが、良しとします。
pyenvのインストール
①pyenvをインストールします。まずは有無のチェックから
jm3nrhMac-mini-:~ akio$ pyenv -v
-bash: pyenv: command not found
、、、無いようです。(ですよね、、、)
②pyenvをインストールします。
jm3nrhMac-mini-:~ akio$ brew install pyenv
//(70行ほど省略)
==> Installing pyenv
==> Pouring pyenv--2.4.0.arm64_sonoma.bottle.tar.gz
🍺 /opt/homebrew/Cellar/pyenv/2.4.0: 1,192 files, 3.5MB
==> Running `brew cleanup pyenv`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
、、、「インストールが終わったよ」というメッセージは見当たりませんが、これで良いそうです。
③pyenvの有無を再度チェック
jm3nrhMac-mini-:~ akio$ pyenv -v
pyenv 2.4.0
参考としたサイトの表示例とバージョン番号が違うようですが、良しとします。
④pyenvの初期化の設定を.zshrcファイルに書き込み、zshrcファイルの設定を反映させる
jm3nrhMac-mini-:~ akio$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
jm3nrhMac-mini-:~ akio$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
jm3nrhMac-mini-:~ akio$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
jm3nrhMac-mini-:~ akio$ source ~/.zshrc
特に、レスポンスはありません。
Pythonのインストール
①インストール可能なPythonのバージョンのリストを見てみます
jm3nrhMac-mini-:~ akio$ pyenv install --list
Available versions:
//(200行ほど省略)
3.12.1
3.12.2
3.13.0a5
3.13-dev
どのバージョンをインストールすれば良いのか、皆目見当がつきません。
保守的にいうと、参考としたサイトと同じものを選ぶならば、実行結果も同じものを得られる可能性が高いのではと思いますが、どうせなら最新のものを使ってみたいものです、、、というミーハーな理由で、リストの中で数字が大きかった「3.12.2」を選びました。
②「3.12.2」のPythonをインストール
jm3nrhMac-mini-:~ akio$ pyenv install 3.12.2
・・(10行ほど省略)
WARNING: The Python lzma extension was not compiled. Missing the lzma lib?
Installed Python-3.12.2 to /Users/akio/.pyenv/versions/3.12.2
なにやらWARNINGが出ているのが非常に気になりますが、ERRORというわけでもなくInstalledとも表示されているので、まずはこのまま動かしてみて様子を見ることにします。(いい加減、、、)
③現在、インストールされているPythonを一覧で確認してみます
jm3nrhMac-mini-:~ akio$ pyenv versions
* system (set by /Users/akio/.pyenv/version)
3.12.2
「3.12.2」が表示されました。
良さそうです。
④今回インストールしたバージョンのPythonを使用するように設定を変更し、Pythonのバージョンを表示させる
jm3nrhMac-mini-:~ akio$ pyenv global 3.12.2
jm3nrhMac-mini-:~ akio$ python --version
Python 3.12.2
「3.12.2」が動いているようです。
良さそうです。
早速、Pythonのコードを動かしてみる
、、、参考にしたサイトのサンプルコードを動かしてみるけれども、Pythonの実行が許可できないとエラーが出てしまう。ちなみにlsをしてもエラーとなる。
jm3nrhMac-mini-:~ akio$ cd ~/Desktop/python_lesson/
jm3nrhMac-mini-:python_lesson akio$ python script.py
/Users/akio/.pyenv/versions/3.12.2/bin/python: can't open file 'script.py': [Errno 1] Operation not permitted
jm3nrhMac-mini-:python_lesson akio$ ls
ls: .: Operation not permitted
jm3nrhMac-mini-:python_lesson akio$
わからない。
コードが云々ではなく、先程インストールして、バージョンまで確認すみのPythonが実行できないということは、どう考えても環境設定に問題がありそうだ。(私のMacOSに対する知識って、こんなもんです)
うーん。
しかし!いつの間にか動くようになった!
原因がわからないまま改善したというのは、エンジニアとしてはとても褒められたことでは無いのだけれども、状況証拠から言うと、ターミナルを再起動したのがトリガーでは無いかと。
ま、いっか。(どなたか、アドバイスいただけると幸いです、、、)
追記_1
新たにTerminalを開くと、また同じエラーとなってしまう。
jm3nrhMac-mini-:~ akio$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
jm3nrhMac-mini-:~ akio$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
jm3nrhMac-mini-:~ akio$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
jm3nrhMac-mini-:~ akio$ source ~/.zshrc
上述の、pyenvの初期化の設定を.zshrcファイルに書き込み、zshrcファイルの設定を反映させる部分を再度実行するとうまくいくようになった。
どうもこの辺が怪しい。
①Ayumiさんの、『京大Python教科書、平方根を求める。』のサンプルコードを実行してみる
ソースコードは、"square_root_1.py"というテキストファイルに保存しています。
jm3nrhMac-mini-:python_lesson akio$ python square_root_1.py
1.414213569772496
おお!同じ結果だ。(当たり前だ!)
私のマシンでは14秒かかった。
(この結果を見て、1.41421356よりあとの桁が丸め誤差だったなんて、なんでわかるんだろう?平方根の数字を覚えていらっしゃる?!)
②Ayumiさんの、『京大Python教科書 平方根を求める 計算方法を変えてみた』のサンプルコードを実行してみる
ソースコードは、"square_root_2.py"というテキストファイルに保存しています。
jm3nrhMac-mini-:python_lesson akio$ python square_root_2.py
1.000000000000000
1.400000000000000
1.410000000000000
1.414000000000000
1.414200000000000
1.414210000000000
1.414213000000000
1.414213500000000
1.414213560000000
1.414213560000000
jm3nrhMac-mini-:python_lesson akio$
おお!同じ結果だ。(当たり前だ!)
しかも、①と比べて圧倒的に結果が出るのが早く、一瞬だ!(当たり前だ!)
まとめ
実行環境が整備できたようなので、これから参考としたソースコードを少しづついじりながら、理解を深めたいと思っています。
ああ、面白かった!
追記_2
計算方法を変えてみた編のコードでは、丸め誤差がなく綺麗に計算できていたけれども、√3では早速、丸め誤差が発生し、√5を試してみると、実行時にエラーとなってしまう。
jm3nrhMac-mini-:python_lesson akio$ python square_root_3.py
1.000000000000000
1.700000000000001
1.730000000000001
1.732000000000000
1.732000000000000
1.732050000000001
1.732050000000001
1.732050800000001
1.732050800000001
1.732050800000001
jm3nrhMac-mini-:python_lesson akio$
最後の1って、丸め誤差だよね、、、
jm3nrhMac-mini-:python_lesson akio$ python square_root_5.py
2.000000000000000
2.200000000000000
2.230000000000000
2.235999999999999
2.235999999999999
2.236059999999999
2.236067000000000
Traceback (most recent call last):
File "/Users/akio/Desktop/python_lesson/square_root_5.py", line 17, in <module>
root2 = root(5)
^^^^^^^
File "/Users/akio/Desktop/python_lesson/square_root_5.py", line 14, in root
print('{:.15f}'.format(r))
^^^^^^^^^^^^^^^^^^^
TypeError: unsupported format string passed to NoneType.__format__
jm3nrhMac-mini-:python_lesson akio$
TypeErrorって、、、ループで同じ変数(r)を渡しているだけなんだけど、、、
、、、因みに、ソースコードはこちら。
def root_digit(square, first, step):
r = first
for i in range(1, 10, 1):
if square < ((r + step) * (r + step)):
return r
r += step
def root(square):
r = 0
step = 1
for i in range(1, 10, 1):
r = root_digit(square, r, step)
step = step / 10
print('{:.15f}'.format(r))
return r
root2 = root(5)
print('{:.15f}'.format(root2))
一筋縄にはいかないようだ。
解決編
ここまで読んでいただき、ありがとうございました。