1.pythonにおける仮想環境とは
jpholidayというモジュールをインストールしようとして、以前のように pip install module でできなかった。ArchWikiの記載もだいぶ変更されていた。最近ついていくのが大変(泣)
早速本題。
pythonのバージョンに影響されない固有の領域といった理解で良いと思われる
参考;https://qiita.com/shun_sakamoto/items/7944d0ac4d30edf91fde
環境は以下のとおり。
$ python -V
Python 3.11.6
$ pip -V
pip 23.3.2
2.仮想環境の作成と有効化
(1)作成
$ cd calholiday # 仮想環境を作りたいディレクトリに移動
$ python -m venv calholiday # calholiday という名前の仮想観光を作る
この時点で、できたファイル群を覗いてみる
cd calholiday
$ ls -al
drwxr-xr-x 5 xxx xxx 4096 Jan 8 16:42 .
drwxr-xr-x 16 xxx xxx 4096 Jan 8 16:42 ..
drwxr-xr-x 2 xxx xxx 4096 Jan 8 16:48 bin
drwxr-xr-x 3 xxx xxx 4096 Jan 8 16:42 include
drwxr-xr-x 3 xxx xxx 4096 Jan 8 16:42 lib
-rw-r--r-- 1 xxx xxx 179 Jan 8 16:42 pyvenv.cfg
$ ls -al bin # 使用するコマンド群か!
drwxr-xr-x 2 xxx xxx 4096 Jan 8 16:48 .
drwxr-xr-x 5 xxx xxx 4096 Jan 8 16:42 ..
-rw-r--r-- 1 xxx xxx 2026 Jan 8 16:42 activate
-rw-r--r-- 1 xxx xxx 952 Jan 8 16:42 activate.csh
-rw-r--r-- 1 xxx xxx 2232 Jan 8 16:42 activate.fish
-rw-r--r-- 1 xxx xxx 9033 Jan 8 16:42 Activate.ps1
-rw-r--r-- 1 xxx xxx 263 Jan 8 16:42 pip
-rw-r--r-- 1 xxx xxx 263 Jan 8 16:42 pip3
-rw-r--r-- 1 xxx xxx 263 Jan 8 16:42 pip3.11
$ ls -al include
drwxr-xr-x 3 ken ken 4096 Jan 8 16:42 .
drwxr-xr-x 5 ken ken 4096 Jan 8 16:42 ..
drwxr-xr-x 2 ken ken 4096 Jan 8 16:42 python3.11
$ ls -al lib
drwxr-xr-x 3 xxx xxx 4096 Jan 8 16:42 .
drwxr-xr-x 5 xxx xxx 4096 Jan 8 16:42 ..
drwxr-xr-x 3 xxx xxx 4096 Jan 8 16:42 python3.11
(2)有効化
ArchWili には、使用しているシェルを bash に前提して「source venv/bin/activate 」を実行しろと書いてあるが、そのようなものは見当たらまお。
上記の通り venv-name//bin/ の中にあるので、
$ souce bin/activate を実行することになる。
(calholiday) $ ← コマンドプロンプトが venv-name になる。$ ← コマンドプロンプトがbashに戻る$ ← コマンドプロンプトがbashに戻る
ちなみに無効化は
(calholiday)$ deactivate
$ ← コマンドプロンプトがbashに戻る
再び有効化して、よし準備ができたとばかりにモジュールをインストールしようとするが、
$ source bin/activate
(calholiday)$ python -m pip install jpholiday
エラーになる
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try ‘pacman -S
python-xyz’, where xyz is the package you are trying to
install.If you wish to install a non-Arch-packaged Python package, create a virtual environment using 'python -m venv path/to/venv'. Then use path/to/venv/bin/python and path/to/venv/bin/pip. If you wish to install a non-Arch packaged Python application, it may be easiest to use 'pipx install xyz', which will manage a virtual environment for you. Make sure you have python-pipx installed via pacman.
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing –break-system-packages.
hint: See PEP 668 for the detailed specification.
ここから何度もあれやり、これやりの試行錯誤が続きます。最終的に成功したのは、
$ bin/pip install –user jpholiday
Collecting jpholiday
Downloading jpholiday-0.1.8-py3-none-any.whl (9.8 kB)
Installing collected packages: jpholiday
Successfully installed jpholiday-0.1.8
[notice] A new release of pip is available: 23.2.1 -> 23.3.2
[notice] To update, run: python -m pip install --upgrade pip
どこにインストールされたのか?と思い探してみたところ、
$ lib/python3.11/site-packages
drwxr-xr-x 10 xxx xxx 4096 Jan 9 16:49 .
drwxr-xr-x 3 xxx xxx 4096 Jan 8 16:42 ..
drwxr-xr-x 3 xxx xxx 4096 Jan 8 16:42 _distutils_hack
-rw-r--r-- 1 xxx xxx 151 Jan 8 16:42 distutils-precedence.pth
drwxr-xr-x 3 xxx xxx 4096 Jan 9 16:49 jpholiday
drwxr-xr-x 2 xxx xxx 4096 Jan 9 16:49 jpholiday-0.1.8.dist-info
drwxr-xr-x 5 xxx xxx 4096 Jan 8 16:42 pip
drwxr-xr-x 2 xxx xxx 4096 Jan 8 16:42 pip-23.2.1.dist-info
drwxr-xr-x 5 xxx xxx 4096 Jan 8 16:42 pkg_resources
drwxr-xr-x 8 xxx xxx 4096 Jan 8 16:42 setuptools
drwxr-xr-x 2 xxx xxx 4096 Jan 8 16:42 setuptools-65.5.0.dist-info
したがってモジュールのインポートには、
$ cd lib/python3.11/site-packages
$ python
>>> import jpholiday
>>>
3.まとめると
今回の仮想環境づくりだけで1日を要してしまった。慣れないこととはいえ、ちょっと・・・そこで、今までの経過をコマンド中心にまとめてみた。
$ mkdir venv-directory # 仮想環境のディレクトリを作成
$ cd venv-directory # そのディレクトリに移動
$ python -m venv venv-directory # 仮想環境の作成
$ source bin/activate # 仮想環境を有効にする
(venv-director-name)$ #コマンドプロンプトが仮想環境のディレクトリ名に変化
(venv-director-name)$ bin/pip install –user module # 新規モジュールのインストール
(venv-director-name)$ cd lib/pytho3.11/site-packages # python3.11でのパッケージインストール先に移動
(venv-director-name)$ python
>>> import module-name #やっとモジュールのインポートができた。
ここまでの下準備が従来のやり方と異なっているということのようだ。これ以降は従前のpython の実行に映る。
コメント