PR

venvを使ったPythonの仮想環境の作り方

working hard on a Python virtual environment プログラミング
記事内に広告が含まれています。
スポンサーリンク
この記事はこんな方におすすめ
  • Pythonを使って何か始めたい
  • 開発環境に色々と適当にインストールしていて管理できていない
  • 開発環境を整理したい

 Pythonに限らず何かを開発する際に、開発環境をプロジェクトごとに管理することは重要です。

 環境ごとに必要なライブラリやパッケージを別けておかないと、あるプロジェクトでは動いたプログラムが別なプロジェクトのプラグラムを動かすために導入や削除・アップグレード・ダウングレードしたパッケージのせいで動かなくなることはよくあります。

 たとえ、

1つのプロジェクトに完全に集中するから関係ない!

 と意気込んでいても、様々な場面で環境を別けた方が良かったと後悔します。

 私は実はあまりこのような管理が得意ではないので、次のような場面で実際に苦労してきました。。

  • 実装しているコードを別な環境に移すと上手く動かない
  • 自分の開発環境とは別にちょっと試してみたいことがあった時に自分の環境では動かない
  • 割り込みの業務があると対応しづらい
  • 新しいプロジェクトに取り掛かる時の環境構築に苦労する

 正直なところ私も色々なプロジェクトに関わる中で完璧に管理できているかというと全然上手くできていない(めんどくさい)です。。

 なので、この記事ではそんな私への自己啓発も込めて、
 非常にお手軽な方法として、Pythonの実行環境を例にvenvを使って仮想環境を作る方法をご紹介します。

お急ぎの方へ

次のコマンドを実行すればmyenvという名前で、
venvを使ったPython実行の為の仮想環境を構築/アクティベートできます。

ターミナルの先頭に(myenv)と表示されていれば仮想環境がアクティベートされています。

ディアクティベートするには次のコマンドを実行します。

実行環境

私の実行環境は次の通りです。

  • Windows 11
  • WSL2(Ubuntu 22.04.3 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64))
  • Python 3.10.12

今回はWindowsマシン上のUbuntuの中にPythonの仮想環境を構築してみたいと思います。

venvとは

venvは軽量な仮想環境の作成を行うことのできるモジュールです。

仮想環境といえばVirtualBoxやDockerを思い浮かべる方も多いと思いますが、venvはPython実行環境に特化しているのでリソースの消費が少ないので軽量と表現されています。

venvを使うメリット
  • 軽量
    Python実行環境を仮想化するだけなので他の仮想化技術のようにOSやコンテナを構築しない。
  • セットアップが簡単
    Pythonの標準ライブラリに含まれているので追加のインストールが不要。
    (Python3.3以降の場合)

ということでPythonを使うだけであれば非常に良い選択肢となります。

仮想環境の作成

 プロジェクトで使うディレクトリに移動して次のコマンドを実行します。

さっそく私の環境で次のコマンドを実行してみます。

すると次のようなメッセージが出ました。

python3-venvが必要らしいです。どうやらWSL環境だと追加でインストールが必要なようです。

ということで、素直に次のコマンドを実行してみます。

特にエラーなくインストールできたようです。

改めて次のコマンドを実行します。

今回はエラーが出ませんでした。というか何も見た目の変化がありません。。

この段階ではmyenvというディレクトリが作成されるだけで仮想環境のアクティベートが必要です。

lsしてみます。

さきほど指定した[仮想環境の名前]のディレクトリが作成されています。
中を見ると何やら色々と入っています。

中身はそれぞれ次のような構成になっているようです。

実際に中身を見てみると例えば、pyenv.cfgは次のようになっていました。

確かにPythonのバージョンが記載されています。

アクティベート

 仮想環境をアクティベートするには次のコマンドを実行します。

このコマンドは先ほど見たフォルダ構成の中のバイナリファイルが格納されているbinディレクト内のactivateを実行しています。

初めに書いている”.”は仮想環境へのパスで、”.”にvenv実行環境がある想定です。

実行に成功すると、次のようにターミナルの先頭にアクティベートされた環境の名前が()付で表示されるようになります。

パッケージのインストール

仮想環境でパッケージを適当にインストールしてみます。

結果、numpy-2.2.2がインストールされました。

pip listを実行して現在の環境にインストールされているパッケージのリストを確認してみます。

仮想環境ではないホスト側の環境ではどうなっているのか確認してみます。

仮想環境のディアクティベートをしてからpip listしてみます。

私のホスト環境にはpipすらインストールされていなかったので実行に失敗しました。

このようにしてホスト環境とは別にmyenvという仮想環境を構築できました。

他の人に共有する時どうするか

 仮想環境の構築をするメリットとして、プロジェクトごとに必要な環境の情報を他人に共有できるということがあります。

自分の書いたコードをテスターにテストしてもらったり、開発環境から本番環境に移行する際に環境に起因する問題発生の確率を少なくして実行できるようになります。

 「環境起因の問題をなくせます」と書かなかったのはPython実行環境以外の差分で生じる問題はあり得るので、問題が生じた際に少なくともPython実行環境に関する差分は問題がないと判断できます。

さて、

さきほど作ったmyenvの環境でインストールしたパッケージのリストを他人に共有する場合どうすればいいでしょうか。

pip listした結果をコピペして都度インストールするのでは大変です。

次のコマンドを実行するとrequirements.txtというテキストファイルに今いる環境にインストール済のパッケージとそのバージョン情報を書きだすことができます

さきほど、numpyしかインストールしなかったので、寂しいですが、requirements.txtの中身は次のようになります。

このrequirements.txtを受け取った側では次のコマンドを実行してrequirements.txtに記載されたパッケージを一括でインストールできます。

rのオプションは、「requirements.txtに記載された内容を一括インストールしますよ」、というオプションです。

他人からコードと共にこのrequirements.txtを受け取った際に自分のホスト環境にインストールしてしまうとホスト環境に存在するパッケージとの互換性からインストールが上手く行かないことがよくあります。

なので、自分のコードを開発する時だけでなく、他人のコードを実行するという観点でも仮想環境の構築は重要になります。

仮想環境を作成・アクティベートしてからreruirements.txtをインストールすることで、pip installはほぼ確実に成功するはずです。

venvの仮想化の仕組み

最後にvenvがどのように仮想化しているのかについて触れます。

簡単に言えば、venvで作成した仮想環境内にいる際にPythonを実行すると、[仮想環境の名前]のディレクトリ配下にある情報を参照して実行するようになっています。

さきほど、仮想環境を作成した時に作成されるディレクトリの中を少し見ましたが、Pythonのバージョンやインストールしたパッケージの情報が記載されていました。

通常、仮想環境にいない時はホスト側にある情報を見に行くところ仮想環境として作成したディレクトリ配下の情報を見に行くように変えていると考えれば良さそうです。

このようなことから考えてみると単に使用するパッケージやPythonバージョンの情報をファイルとして管理しただけのようなイメージで、軽量であるというのも納得できます。

仮想環境の作成というより、
実行時に参照するファイルのパスを変えているだけ?

という風にも捉えられます。ということは、次のような疑問が浮かびます。

venvで作った仮想環境配下でroot権限でパッケージをインストールするとホスト側にインストールされるのでは?

ということで、実際に先ほどのnumpyインストールをsudo付きでmyenv環境から実行してみたのですが、

と表示されました。先ほど書いたように、私のホスト環境にはpipは無いので、仮想環境の外に出てしまっていることが分かります。

ということで、

sudoは仮想環境の中では厳禁です!

まとめ

 今回はPythonの実行環境の仮想化する方法について書いてみました。

 個人的には仮想環境の管理はめんどくさく感じてしまうのですが、やはりこれを怠ってしまうとさらにメンドクサイ問題にぶつかってしまいます。

 Python実行環境であればvenv使ってかなり簡単に仮想環境の構築・管理ができるので初めの一歩としてもおススメです。

 venvは使ったことはあったのですが、仮想環境の中でsudoを使うとホスト側に行ってしまうというのは考えたことが無かったので記事を書く中で中々面白い発見をしたなと思いました。

以上、参考になれば嬉しいです。

コメント

タイトルとURLをコピーしました