Pythonの仮想環境を作成する(venv、Windows)

はじめに

 今回はPythonの仮想環境の作成についてまとめてみました。

 Pythonを利用したNode-REDのノードを開発するときに仮想環境を詳しく調べていました。作成した仮想環境をコマンドで利用する方法は調べると出てくるのですが、私の場合はJavaScriptで利用する必要がありました。ちょっと変な使い方をしているかもしれません。

 仮想環境を作成することで、以下のような利点があります。

  • システム全体で利用するPythonの環境とは切り分けて実行できる
  • Pythonやパッケージのバージョンを指定して実行できる

 開発をする上で必要なパッケージが明確になりますし、作成した仮想環境のフォルダを削除すればやり直すことができて便利です。

▼python-venvノードの開発にも関連している内容です。

Node-REDのノードを作成してみる その1(python-venv)

はじめに  今回はNode-REDでPythonの仮想環境を利用できるノードを作成してみました。  これまでNode-RED MCU用のノードを作成したことはありますが、Node-RED用は2つ目…

▼以前の記事はこちら

PythonでVOICEVOX COREを使ってみる(音声合成)

はじめに  以前の記事でGoogle Cloud Platformの音声合成・音声認識を試したのですが、利用回数が多いとお金がかかります。やっぱり無料で実行したいということで、今回…

Whisperを使ってみる(音声認識、OpenAI、Python)

はじめに  今回はOpenAIのWhisperを使ってみました。  OpenAIのサービスはAPIキーを使って有料で利用するイメージがあったのですが、ソースコードはMIT Licenseで公開さ…

関連情報

▼venvのドキュメントはこちら。venvが追加されたのはversion 3.3からみたいですね。

https://docs.python.org/3/library/venv.html

▼Windows環境におけるPython仮想環境構築ガイドはこちら。

https://www.python.jp/install/windows/venv.html

▼こちらにはWindowsのショートカットで、仮想環境のpythonで実行する方法も紹介されていました。

https://pi-trade.tech/programing-learning/python-venv-how-to

Pythonのインストール

 今回はWindows環境のPythonで実行しています。

▼python -Vで表示されるシステムのPythonのバージョンは3.8.3になっています。

▼3.12もインストールしておきました。

https://www.python.org/downloads/release/python-3124

▼インストールするときは、推奨されていたWindows installer (64-bit)をダウンロードして実行しました。他のバージョンをインストールするときも同じ手順です。

▼私のPCにはすでにいろいろ入っています。

▼後で仮想環境を作成する際に、バージョンを指定することができます。

 Pythonのパッケージによってはバージョンによって実行できなかったり、依存しているパッケージがインストールできなかったりします。バージョンを切り替えて実行できるのは便利です。システムのPythonを毎回削除してインストールするのは大変です...

▼例えばPython 3.12では、Setuptoolsパッケージが仮想環境を作成した際にデフォルトではインストールされなくなっています。バージョンが異なるとこういった変更があります。

https://docs.python.org/3/whatsnew/3.12.html#:~:text=Important%20deprecations%2C%20removals,method%20aliases.

仮想環境を作成して有効化する

 Windowsのコマンドプロンプトで実行します。今回はpyenvという名前の仮想環境を作成します。

▼コマンドはこちら。ディレクトリを移動して、中身を表示してみます。

▼実行するとこのように表示されます。

 LibフォルダとScriptsフォルダの中身を見てみます。

▼Lib/site-packagesに、インストールしたパッケージが追加されていきます。

▼Scriptsフォルダには実行ファイルが入っています。

 Scriptsフォルダに入っているactivate.batかactivateを実行すると、仮想環境が有効になります。逆に、deactivate.batを実行すると無効化されます。

 Activate.ps1は実行してもファイルがメモ帳で開くだけで有効化はされませんでした。こちらはWindowsのコマンドプロンプトではなくPowerShellで実行するものになっています。

▼先程移動したpyenvディレクトリで以下のコマンドを実行します。

▼仮想環境が有効になると、左側に仮想環境の名前が表示されます。

▼この状態でpip listを実行すると、パッケージが全然インストールされていない状態になっています。

 システムのPythonにインストールされているパッケージとは異なっています。

▼システムのpip listだと表示が異なっています。

 なお、WindowsのPowerShellでActivate.ps1を実行するには、事前に実行を許可しておく必要があるようです。

▼コマンドはこちら

▼PowerShellでも仮想環境が有効化されています。

Pythonのバージョンを指定して仮想環境を作成する

 システムではPython 3.8でしたが、Python 3.12で実行できる仮想環境を作成してみます。

 Windowsではpy.exeを利用して、バージョンを指定して仮想環境を作成することができます。

▼ドキュメントのこちらに書かれています。

https://www.python.jp/install/windows/venv.html#4vYgls

 なお前提として、利用したいバージョンのPythonがシステムにインストールされていることが必要です。

▼インストールされていないPythonのバージョンで作成しようとすると、No suitable Python runtime foundと表示されます。

 仮想環境を作成して有効化します。今回はpyenv312という名前の仮想環境を作成しました。

▼コマンドはこちら

▼python -Vでバージョンを確認すると、Python 3.12と表示されています。

▼dirコマンドでScriptsフォルダを見ると、pip3.12.exeも入っています。

仮想環境でプログラムを実行する

 デフォルトではインストールされていないパッケージを用いて、システムの環境と切り分けることができているのかを確認してみます。

 今回はrequestsパッケージが必要なプログラムで動作確認を行いました。Pythonのプログラムを、先程作成したpyenv312フォルダにtest.pyという名前で保存しました。

▼urlは適宜変更してください。

import requests
url = 'https://example.com/'
    
try:
    response = requests.get(url)

    if response.status_code == 200:
        print(response.text)
    else:
        print(f"Failed to retrieve data. Status code: {response.status_code}")
except requests.RequestException as e:
    print(f"An error occurred: {e}")

 requestsをインストールしていない状態だと、ModuleNotFoundError: No module named 'requests'というエラーが出ます。

▼仮想環境の有効化前、有効化後の両方で実行できていません。

 仮想環境にrequestsをインストールして、再度実行してみました。

▼インストールするためのコマンドはこちら

▼実行することができました!

▼再度システムのPythonで実行しても、requestsがインストールされていない状態です。先程の仮想環境とはパッケージを切り分けることができています。

有効化せずに仮想環境でプログラムを実行する

 CUIで実行するときは、activateしてからであれば仮想環境でプログラムを実行できました。それに対し、プログラムでプログラムを呼び出すときはactivateせずに実行できた方が簡単に使えます。

 このとき、作成した仮想環境に含まれるpython.exeまたはpip.exeを利用することで、実行することができます。

 再度、先程のrequestsを使ったプログラムで動作確認をしてみます。仮想環境を有効化せずに、Scriptsフォルダにあるpython.exeを利用してプログラムを実行します。

▼作成した仮想環境のディレクトリで、以下のコマンドを実行します。

▼仮想環境を有効化せずにプログラムを実行できました!

 同様にJavaScriptで仮想環境を利用してPythonを実行するときは、仮想環境のScriptsフォルダにあるpython.exeのパスと、プログラムのパスを渡せば実行できます。

▼JavaScriptをNode.jsで実行する場合、child_processのexecやexecSync、spawnでPythonのプログラムを実行したことがあります。

https://nodejs.org/api/child_process.html

OSによるvenvのディレクトリ構造の違い

 python-venvノードの開発に関する記事にも書いていたのですが、OSによる違いがあります。

 ドキュメントに書かれていて、Windows環境かどうかでファイル構成が異なります

▼こちらのページに書かれています。

https://docs.python.org/3/library/venv.html

▼引用すると、このように書かれています。

It also creates a bin (or Scripts on Windows) subdirectory containing a copy/symlink of the Python binary/binaries (as appropriate for the platform or arguments used at environment creation time). 

It also creates an (initially empty) lib/pythonX.Y/site-packages subdirectory (on Windows, this is Lib\site-packages).https://docs.python.org/3/library/venv.html

 以下の2つのフォルダ名が異なります。

  • bin(Windowsの場合はScripts)
  • lib/pythonX.Y/site-packages(Windowsの場合はLib\site-packages)

 bin/Scriptsにはpipやpython(Windowsだと.exeファイル)が入っています。また、site-packagesには仮想環境にインストールしたパッケージが入っています。

 仮想環境を利用したソフトウェアを作成する際は要注意ですね。python-venvノードでは、Windowsかどうかで分岐しています。

最後に

 Pythonの仮想環境を利用するのは、ソフトウェア開発をする上でとても便利です。他のプログラムから呼び出して利用することもできます。

 私は最近JavaScriptとPythonの両方をよく使っているのですが、特にAIを利用するときはPython、プログラムの呼び出しはJavaScriptというような使い方をしています。ただ私は機械系の学生であって、現場で使っているわけでは無いので結構変なやり方をしているかもしれません。

 バージョンやパッケージの切り分けについて現場で使われている方法、もっと便利な方法があればコメント等で教えて頂けると幸いです。

▼python-venvノードはGitHubにソースコードを公開しています。ご興味があればご覧ください。

https://github.com/404background/node-red-contrib-python-venv

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です