概要

みろりHPのトップページにある “Pickup” は、近年の記事をひとつランダムに表示する機能だ。みろりHPv3を作るときに、なんとなく作ってみた機能である。

そこに、6年前に書いた記事が出てきたぞ。

いまでは、どんな方法で複数バージョンの Python を併用しているのか、当時を懐かしみながら、書く。

 

pipenv

まあ pipenv だろう。この Python 仮想環境ツールは、フォルダごとに Python の仮想環境を創ってくれる。仮想環境へは pipenv shell で突入することができる。また、 pipenv run で、仮想環境に入らずとも仮想環境内でコマンドを実行することができる。ひとつのフォルダの中に2重に環境が存在している感じで、裏世界っぽくてちょっと中二心をくすぐる。

じゃあ始めよう。 pipenv はもうインストールできているものとしようぜ。

$ pipenv --version
pipenv, version 2022.3.28

さきほど “フォルダごとに仮想環境を創ってくれる” と書いたが、今回は2.7と3.8のふたつのフォルダを用意した。

ではふたつのバージョンを手に入れよう。もしこれをやってみたいなら、 $ がついている行だけをコピペするんだぜ。その他の部分はコメントとか出力を指す。ほんで $ 自体はコピペっちゃダメだぜ。そのあとのコマンドだけをコピペするんだ。

# 2.7 フォルダに入る。
$ cd 2.7/

# 2.7 バージョンを指定して仮想環境を作る。
2.7 $ pipenv install --python 2.7
Warning: Python 2.7 was not found on your system...
Would you like us to install CPython 2.7.18 with Pyenv? [Y/n]: y
# ↑そのバージョンがぱそこに無いと、 "よかったらぱそこにインストールしたろか" と
# 気を利かせてくれるぜ。

Installing CPython 2.7.18 with /usr/local/bin/pyenv (this may take a few minutes)...
✔ Success!
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
patching file configure
patching file configure.ac
patching file setup.py
patching file Mac/Tools/pythonw.c
patching file setup.py
patching file Doc/library/ctypes.rst
patching file Lib/test/test_str.py
patching file Lib/test/test_unicode.py
patching file Modules/_ctypes/_ctypes.c
patching file Modules/_ctypes/callproc.c
patching file Modules/_ctypes/ctypes.h
patching file Modules/_ctypes/callproc.c
patching file setup.py
patching file Mac/Modules/qt/setup.py
patching file setup.py
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

Creating a virtualenv for this project...
Pipfile: /Users/user/Documents/GitHub/multi-pythons/2.7/Pipfile
Using /Users/user/.pyenv/versions/2.7.18/bin/python2.7 (2.7.18) to create virtualenv...
⠸ Creating virtual environment...created virtual environment CPython2.7.18.final.0-64 in 2160ms
  creator CPython2Posix(dest=/Users/user/.local/share/virtualenvs/2.7-gAD6NA2_, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/user/Library/Application Support/virtualenv)
    added seed packages: pip==20.3.4, setuptools==44.1.1, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment! 
Virtualenv location: /Users/user/.local/share/virtualenvs/2.7-gAD6NA2_
Creating a Pipfile for this project...
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Updated Pipfile.lock (dfae9f)!
Installing dependencies from Pipfile.lock (dfae9f)...
   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

# ここまでしばらく待つと 2.7 の仮想環境完成だ。
# このコマンド↓で、仮想環境内の Python のバージョンを見てみよう。
2.7 $ pipenv run python -V
Python 2.7.18

じゃあ次は3.8だ。

# 3.8 フォルダに入る。
2.7 $ cd ../3.8/

# 3.8 バージョンを指定して仮想環境を作る。
3.8 $ pipenv install --python 3.8
Creating a virtualenv for this project...
Pipfile: /Users/user/Documents/GitHub/multi-pythons/3.8/Pipfile
Using /usr/bin/python3 (3.8.9) to create virtualenv...
⠦ Creating virtual environment...created virtual environment CPython3.8.9.final.0-64 in 1046ms
  creator CPython3macOsFramework(dest=/Users/user/.local/share/virtualenvs/3.8-aE7r78vn, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/user/Library/Application Support/virtualenv)
    added seed packages: pip==22.0.4, setuptools==61.3.1, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment! 
Virtualenv location: /Users/user/.local/share/virtualenvs/3.8-aE7r78vn
Creating a Pipfile for this project...
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Updated Pipfile.lock (db4242)!
Installing dependencies from Pipfile.lock (db4242)...
   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

# 3.8 はもうぱそこに入っていたのでスグに終わったぜ。仮想環境完成。
# バージョンはもちろん3.8だ↓
3.8 $ pipenv run python -V
Python 3.8.9

おしまい。だけど遊んだ仮想環境は pipenv --rm コマンドで、ちゃんと片付けて終わろう。

# 2.7 フォルダに入って仮想環境を消す。
3.8 $ cd ../2.7/
2.7 $ pipenv --rm
Removing virtualenv (/Users/user/.local/share/virtualenvs/2.7-gAD6NA2_)...

# 3.8 フォルダに入って仮想環境を消す。
2.7 $ cd ../3.8/
3.8 $ pipenv --rm
Removing virtualenv (/Users/user/.local/share/virtualenvs/3.8-aE7r78vn)...

 

当時を懐かしみながら所感

  • 当時は py -2.7 とか py -3.4 みたいなコマンドで表面的にバージョンを併用していたね。現在では pipenv によって、仮想環境を作ることに慣れているので、仮想環境ごとバージョンを併用している感じだ。
  • 当時は、実行しているバージョンを示すために sys.version_info のスクリプトを使っている。現在であれば、まあ python -V でもいいし、コードを使うにしても python -c 'import sys; print(sys.version_info)' みたいに、スクリプトを作ることを避けて最小の要素のみで記事を作る気がする。
  • 当時の記事に「実行ファイル名ってクォーテーションで囲んでも囲わなくてもよいのな」という記述がある。まあ、よいというか、ひとつの文字列として認識されるような文字列であればよいな。ファイル名に、スペースが入っていたりするとダメ。
  • 当時はプログラミングで遊ぶのに Windows のコマンド・プロンプトを使っていやがるな……。いま見ると、ここが一番異様。いや、最初は当然そうなんだけど。今回は Mac の Terminal ね。