見出し画像

2023-9-26「Windows VScodeでPython 仮想環境をつかってみる」

今日はPythonの仮想環境をvs codeと一緒に使ってみようと思います。

まず「仮想環境って何?」というところなのですが、

Pythonの何がいいかって、開発元から提供されるモジュール群が気が利いていていたれりつくせりで、そこにさらに世界中の皆様が提供してくださる無限のモジュール群が痒い所に手が届く内容で、そしてそれらを超簡単にアップデートできるツールなどなど、非常に便利なモノが揃っているところなんですが、

それでも何年も経過しますとアップデートされなくなったモジュール、開発が終了してしまったり既に古くなってしまったプラットフォームや周辺機器に向けたモジュールなど、時が止まったものも出てきます。

新しいものだけを追っていればいいのであれば単に無視してしまえばすむことですが、パソコンとかOSとかあるいはシステムやツールなどのアプリケーション、周辺機器など「これを動かすためにはどうしてもこのバージョンでなければいけない」みたいなケースも出てきます。

全部のモジュールを最新にすると、このモジュールとモジュールが不適合になって使えない。

仕方ないのでPythonのバージョンはこれ、このモジュールのバージョンはこれ、このモジュールのバージョンはこれ。このモジュールは便利だけど他とケンカするから外す。……などの調節が必要になってくることがあります。

ただ、こういう環境でしかPythonを使えない、このパソコン上のPythonはこの設定しか使えない、となると不便です。Pythonの長所も薄れてしまいます。調整した環境と最新の環境は切り替えて使いたいです。

この「環境を切り替える」みたいな考え方はPythonの設計時にはまだなかったみたいで、搭載されてなかったんですね。簡単に切り替えられるようにはなっていませんでした。

環境切り替えの方法として生み出されたのが「仮想環境」というシステムでした。仮想というと何もインストールされないみたいなんですが、実際には指定フォルダにまとめて環境がガッツリと作成されます。

環境変数や実行ファイルパスなどOS依存の内容をスクリプトやバッチファイルで結構大胆に書き換えることで環境切り替えを実現しているようです。

以上が仮想環境の説明なんですが、これだけだと実際にどうすればいいのか微妙にわからないと感じました。

いくつか仮想環境を作ったりもしたんですが、どこに作ったのか忘れてしまったり、古いバージョンのPythonを削除したら仮想環境が動かなくなっていたり、そういう失敗を繰り返してしまいました。

  • 仮想環境の指定フォルダってどこに作ればいいの?

  • 指定フォルダの中にはWindowsではバッチファイルとPowerShellスクリプトが用意されるみたいなんだけど、どっちを使えばいいの?

  • 環境の切り替えはどうするの? いちいちコンソールを起動して手動でスクリプトを実行すればいい? それともショートカットみたいなのを準備する?

  • コンソールで起動したスクリプトはvscodeの環境内に反映されるの?

  • Pythonのファイル自体はどこに置くもの? 仮想環境のフォルダとごっちゃになりそう?

今日はこのあたりを整理できればいいのですが。

色々インストールする

まず足りないものがないよう、基本の環境構築から始めます。

Python最新版をインストールする

https://www.python.org/ にアクセスして最新版をダウンロードしてきて、入れます。

PowerShell最新版をインストールする

マイクロソフトのドキュメントによると「wingetコマンドでのアップデートを推奨します」と書いてあります。ただこれは罠が多いんですよね。そもそもこのwingetコマンドはWindows10にはインストールされてなくて動かないみたいです。普通にマイクロソフトからgithubのページに飛んで、アーカイブをダウンロードするのが近道だと感じました。

「アプリ インストーラー」をインストールする

このアプリはマイクロソフトストアなどで入手できるとのことですが、私の環境の場合はPowerShell最新版を入れたあとにバックグラウンドでダウンロードが始まっていたみたいで、いつのまにか通知が出て使用可能になっていました。この「アプリ インストーラー」が入っていないと、先ほどのwingetというコマンドは使用できないようです。Windows11をお使いの場合でも、このアプリインストーラーはすでにインストールされているみたいです。

Terminalをインストールする

wingetコマンドを使わない方がいい理由はもうひとつありまして、wingetを実行するとなぜか文字化けが発生して日本語がまったく表示されない不具合が発生することがあります。wingetが立ち上がる際にコンソールをいじろうとする(おそらく進行バーなんかを表示するために)のですが、その際にフォントが"consolas"になってしまい、日本語がないフォントなので盛大に化けます。あきらかにwingetの不具合だと思いますが。

ただこの「コンソールウインドウ」をアップデートすると改善するらしいので今回はその方法を選びました。

古くは「MS-DOSプロンプト」「DOSプロンプト」「コマンドプロンプト」と呼ばれていたこの画面の裏で動いていたウインドウの方、「ターミナルエミュレータ」というのが正式名称なんでしょうか。こいつもWindows3.1やWindows95のころからずっと改造されつつ使われてきたのだろうと思いますが、いい加減設計が古くなってしまったので置き換えが進んでいるようです。

マイクロソフトから「ターミナル」をダウンロードしてきてインストールします。こちらのアプリもWindows11であればインストール済みのようです。

VScodeをインストールする

Visual Studio code もインストールします!
Python用の拡張機能も入れておきます。

仮想環境を作る

自分のフォルダを作る

わたしは「python」というフォルダを作ってその下に「.env」「src」の2つのフォルダを作りました。
「.env」の方を仮想環境保存用、「src」がPythonのソース保存用に考えています。

こうしたのは、あとで忘れないようにできるだけ近いフォルダ構成にしておくのがいいのではないか、ということと、
かといってソースと仮想環境を同じフォルダにしてしまうと不都合が考えられます。仮想環境はローカル依存なのでこのPCのフルパス情報が色々入っており、公開するのにもバージョン管理するのにも向いてないからです。

vscodeからこのフォルダを開く

一番スマートな方法はどうするのがいいんですかね。右クリックの「codeで開く」を使ってたんですけど、Windows11にすると1クリック動作が増えちゃうんですよね。

ターミナルを起動、.envに移動する

これも右上の「パネルの切り替え」をクリックしたり、.envを右クリックしてターミナルを起動、を選んでもいいです。

仮想環境を作成

たとえば「Test」という名前で仮想環境を作成する場合、

python -m venv Test

仮想環境に切り替え

Ctrl + Shift + P でコマンドパレットを開いて
「Python: インタープリタ―の選択」という機能を探して
+インタープリターパス として先ほど作成した仮想環境 Testのフォルダを指定します

Ctrl + Shift + @ でターミナルを開きなおすと (Test)の仮想環境に入ることができます。

この方法のいいところは仮想環境のスクリプト実行もvscodeがやってくれることと、vscode自体がこの仮想環境の下で動いてくれることですね。

実際に仮想環境下でモジュールダウンロードなどを行ってみます。

(Test) PS C:\_work\create\python> pip install pyautogui 
Collecting pyautogui
  Using cached PyAutoGUI-0.9.54.tar.gz (61 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting pymsgbox (from pyautogui)
  Using cached PyMsgBox-1.0.9.tar.gz (18 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting pytweening>=1.0.4 (from pyautogui)
  Using cached pytweening-1.0.7.tar.gz (168 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting pyscreeze>=0.1.21 (from pyautogui)
  Using cached PyScreeze-0.1.29.tar.gz (25 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting pygetwindow>=0.0.5 (from pyautogui)
  Using cached PyGetWindow-0.0.9.tar.gz (9.7 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting mouseinfo (from pyautogui)
  Using cached MouseInfo-0.1.3.tar.gz (10 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting pyrect (from pygetwindow>=0.0.5->pyautogui)
  Using cached PyRect-0.2.0.tar.gz (17 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting pyscreenshot (from pyscreeze>=0.1.21->pyautogui)
  Using cached pyscreenshot-3.1-py3-none-any.whl (28 kB)
Collecting Pillow>=9.3.0 (from pyscreeze>=0.1.21->pyautogui)
  Obtaining dependency information for Pillow>=9.3.0 from https://files.pythonhosted.org/packages/54/9b/debe992677af84859ec1e38777b1d5c0671918188324153ecbc1f16f6cb6/Pillow-10.0.1-cp311-cp311-win_amd64.whl.metadata 
  Downloading Pillow-10.0.1-cp311-cp311-win_amd64.whl.metadata (9.6 kB)
Collecting pyperclip (from mouseinfo->pyautogui)
  Using cached pyperclip-1.8.2.tar.gz (20 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting EasyProcess (from pyscreenshot->pyscreeze>=0.1.21->pyautogui)
  Using cached EasyProcess-1.1-py3-none-any.whl (8.7 kB)
Collecting entrypoint2 (from pyscreenshot->pyscreeze>=0.1.21->pyautogui)
  Using cached entrypoint2-1.1-py2.py3-none-any.whl (9.9 kB)
Collecting mss (from pyscreenshot->pyscreeze>=0.1.21->pyautogui)
  Using cached mss-9.0.1-py3-none-any.whl (22 kB)
Downloading Pillow-10.0.1-cp311-cp311-win_amd64.whl (2.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.5/2.5 MB 525.3 kB/s eta 0:00:00
Building wheels for collected packages: pyautogui, pygetwindow, pyscreeze, pytweening, mouseinfo, pymsgbox, pyperclip, pyrect
  Building wheel for pyautogui (pyproject.toml) ... done
  Created wheel for pyautogui: filename=PyAutoGUI-0.9.54-py3-none-any.whl size=37597 sha256=04a652e61e64363922105236259ac8a5b216eb78a99498ae504c59ac5fc0527a
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\95\dc\b1\fe122b791e0db8bf439a0e6e1d2628e48f10bf430cae13521b
  Building wheel for pygetwindow (pyproject.toml) ... done
  Created wheel for pygetwindow: filename=PyGetWindow-0.0.9-py3-none-any.whl size=11081 sha256=e964c174b2a168d471a42d985b65d197c13c783be2dc8f3aa5779932254d6826
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\07\75\0b\7ca0b598eb4c21d43ba4bcc78a0538dfcf803a5997da33bc19
  Building wheel for pyscreeze (pyproject.toml) ... done
  Created wheel for pyscreeze: filename=PyScreeze-0.1.29-py3-none-any.whl size=13484 sha256=b70e22f25ebe384912179d2d3be69b8a14e3f826c868d8f13a75c7c5f9022c86
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\d3\bd\06\4b4c57f65e89d1ab7a63a924c12aca4784cd95e74940371b5e
  Building wheel for pytweening (pyproject.toml) ... done
  Created wheel for pytweening: filename=pytweening-1.0.7-py3-none-any.whl size=6213 sha256=b6ec3bc5428ef401934ed94b75bb25b658c06b16fb08f3ac283b49b9d8f345d0
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\b2\9b\02\059beba389e7e31a635bd9e8d9b7299f4ec11caca1f237f56d
  Building wheel for mouseinfo (pyproject.toml) ... done
  Created wheel for mouseinfo: filename=MouseInfo-0.1.3-py3-none-any.whl size=10903 sha256=b6c10b2fbfa83229b8eb9ae0e6742a01b9c49853fb17f5d6591b91bed92bd32f
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\20\0b\7f\939ac9ff785b09951c706150537572c00123412f260a6024f3
  Building wheel for pymsgbox (pyproject.toml) ... done
  Created wheel for pymsgbox: filename=PyMsgBox-1.0.9-py3-none-any.whl size=7417 sha256=eafbb4c1ca437e70563a89fb6d89c1d1c8abfcd8b0bd2c3e0dcc328c81dcdbb9
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\85\92\63\e126ee5f33d8f2ed04f96e43ef5df7270a2f331848752e8662
  Building wheel for pyperclip (pyproject.toml) ... done
  Created wheel for pyperclip: filename=pyperclip-1.8.2-py3-none-any.whl size=11136 sha256=2ceaad377bc45e1c0738c0c21719d8020f460c650764c72598fe4268ad7d2e6b
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\70\bd\ba\8ae5c080c895c9360fe6e153acda2dee82527374467eae061b
  Building wheel for pyrect (pyproject.toml) ... done
  Created wheel for pyrect: filename=PyRect-0.2.0-py2.py3-none-any.whl size=11205 sha256=d56648cc5077c254513a450472755e244b3e24be407a58b06862852c232e49e9
  Stored in directory: c:\users\owner\appdata\local\pip\cache\wheels\c4\e9\fc\b7a666dd4f9a3168fb44d643079b41d36ddab52f470707e820
Successfully built pyautogui pygetwindow pyscreeze pytweening mouseinfo pymsgbox pyperclip pyrect
Installing collected packages: pytweening, pyrect, pyperclip, pymsgbox, entrypoint2, EasyProcess, pygetwindow, Pillow, mss, mouseinfo, pyscreenshot, pyscreeze, pyautogui
Successfully installed EasyProcess-1.1 Pillow-10.0.1 entrypoint2-1.1 mouseinfo-0.1.3 mss-9.0.1 pyautogui-0.9.54 pygetwindow-0.0.9 pymsgbox-1.0.9 pyperclip-1.8.2 pyrect-0.2.0 pyscreenshot-3.1 pyscreeze-0.1.29 pytwee
ning-1.0.7                                                                                                                                                                                                            

「Python:インタープリターの選択」をふたたび呼び出して、環境設定をもとに戻してからモジュールリストを表示、さきほどインストールしたモジュールが出てこないことを確認します。

PS C:\_work\create\python> pip list
Package    Version
---------- -------
pip        23.2.1
setuptools 65.5.0

きちんと別環境として構築できているようです。

以上、ここまで読んでいただいてありがとうございました。



いいなと思ったら応援しよう!