Pythonの仮想環境チョットワカリタカッタ
仮想環境とは?
ふと気になったので調べてみた。多分パスをいじってるんだろうなーって思ってたけど、改めて確認したかった。
仮想環境の作り方、使い方は書いてあるけど、結局中で何が行われてるのか気になるという人向けいるのかそんな人?
結局何してたの?
パスを書き換えていました。(予想通り)
そもそもPATHって?
プログラム(実行可能ファイル)は本来フルパスを指定しなければ実行できません。
フルパスとは、Windowsでは、C:\
で始まるデータの保存場所を示す文字のことを指します。
いちいちプログラムの保存場所を覚えたり、使うたびに探すのは非効率的。
そのため、よく使うファイルの場所は一箇所にまとめておくと効率的で嬉しいですよね。
それが環境変数PATHです。
以下のコマンドを実行して出力されたものが、PATHと呼ばれているものの実体です。
(windows) > echo %PATH%
(linux) > echo $PATH
当方の環境だと、以下のような感じです。
出力の結果は人によって変わります。以下ではLinuxで説明していきます。
~$ echo $PATH
/opt/ThirdParty-6/platforms/linux64Gcc/gperftools-svn/bin:/opt/paraviewopenfoam56/bin:/home/cuz/OpenFOAM/cuz-6/platforms/linux64GccDPInt32Opt/bin:/opt/site/6/platforms/linux64GccDPInt32Opt/bin:/opt/openfoam6/platforms/linux64GccDPInt32Opt/bin:/opt/openfoam6/bin:/opt/openfoam6/wmake:/home/cuz/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
例えば上の環境の中の/usr/bin
の下のpythonを出力すると
$ ls | grep python
dh_python2
dh_python3
python
python2
python2.7
python3
python3-config
python3.6
python3.6-config
python3.6m
python3.6m-config
python3m
python3m-config
x86_64-linux-gnu-python3-config
x86_64-linux-gnu-python3.6-config
x86_64-linux-gnu-python3.6m-config
x86_64-linux-gnu-python3m-config
さらにこの中のpython3.6
のファイルのタイプを調べてやると・・・
$ file python3.6
python3.6: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=09148930900f465f0cb964452b0ac22986fae752, stripped
要するに実行可能ファイルであることがわかります。
いつも、シェル上で我々が単純にpython3
と打ち込んだときに、きちんとPythonが実行されるのはPATHを通しているからなんですね。
じゃあ仮想環境は何をしてるの?
※pipenv
で説明を行いますが、別の仮想環境もやってることは変わらないと思います。
仮想環境を作成すると、カレントディレクトリもしくは所定の場所に仮想環境で使用するPythonやライブラリのインストールされるディレクトリができます。
当方の環境だと、/home/.local/share/virtualenv/test-tJa6NcU0/
という場所に作成されました。
そのディレクトリを開くと、下記のようになります。
.
├── bin
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── activate.ps1
│ ├── activate.xsh
│ ├── activate_this.py
│ ├── easy_install
│ ├── easy_install-3.6
│ ├── pip
│ ├── pip3
│ ├── pip3.6
│ ├── python -> python3
│ ├── python-config
│ ├── python3
│ ├── python3.6 -> python3
│ └── wheel
├── include
│ └── python3.6m -> /usr/include/python3.6m
└── lib
└── python3.6
この中で、pipenv shell
を実行すると上記のファイルのうちactivate
が実行されます。
このactivate
の中身を一部抜粋すると、
(略)
# 仮想環境ディレクトリのPATHを環境変数にセット
VIRTUAL_ENV="/home/cuz/.local/share/virtualenvs/test-tJa6NcU0"
export VIRTUAL_ENV
# 過去の環境変数を_OLD_VIRTUAL_PATHにセット
_OLD_VIRTUAL_PATH="$PATH"
# PATHの先頭に仮想環境のPATHを設定
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
ということをやっています。
PATHのところでは説明していませんでしたが、PATHは前から検索が行われ、最初に見つかった場所のファイルが呼ばれる仕組みになっています。
つまり、activate
内では優先的に仮想環境ディレクトリのPythonやその他ライブラリを呼び出すように設定しているだけなのでした。
で?
と言われると何も言えないです。\(^o^)/
とはいえ、何も考えずにただ使ってるだけよりわかって使ってる方が、何か合った時に力になる・・・と信じたい\(^o^)/
Author And Source
この問題について(Pythonの仮想環境チョットワカリタカッタ), 我々は、より多くの情報をここで見つけました https://qiita.com/cuz/items/f442aed0151ab8918dae著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .