Python仮想環境の原理と使用の詳細


Pythonの仮想環境は人々の生活を大きく便利にしました。このガイドは仮想環境の基礎知識と使い方を紹介してから、仮想環境の背後にある工作原理を詳しく紹介します。
注意:このガイドは、macOS Mojaveシステムで最新バージョンのPython 3.7.xを使用します。
1.なぜ仮想環境を使うか?
仮想環境は、一連の潜在的な問題のための簡単な解決策を提供し、特に以下のいくつかの態様では、
  • は、依存性の問題を解決するために、異なるバージョンのプログラムパッケージを使用することができます。例えば、Project A v 2.7をProject Xに使用し、Package A v 1.3をProject Yに利用することができる。
  • は、デマンド・ファイル内のすべてのパケット依存項を獲得することによって、プロジェクトを自ら含み、再現することができる。
  • は、管理者権限がないホストにソフトウェアパッケージをインストールする。
  • は一つの項目だけが必要で、システムの範囲内にソフトウェアパッケージをインストールする必要がなく、グローバルsite-packages/ディレクトリを綺麗に保つことができます。
  • 便利そうですね。より複雑なプロジェクトを構築し、他の人と協力することによって、仮想環境の重要性が浮き彫りになります。多くのデータ科学者も仮想環境における多言語関連のConda環境を熟知しなければならない。
    先着順に使えます。
    2.仮想環境とは?
    いったい何が仮想環境ですか?
    仮想環境は、項目管理とプロジェクト分離に依存するPythonツールであり、Pythonサイトパケット(サードパーティライブラリ)は、グローバルインストール(すなわちシステム範囲内のPythonの一部として)ではなく、ローカル特定項目の分離ディレクトリにインストールされることができる。
    これはよさそうですが、何が仮想環境ですか?仮想環境は三つの重要なコンポーネントを含むディレクトリにすぎない。
  • は、サードパーティライブラリのsite-packages/フォルダをインストールします。
  • システムにインストールされたPythonは、ファイルのsymlinkシンボルリンクを実行することができます。
  • は、Pythonコードを実行するスクリプトが、所与の仮想環境にインストールされたPythonインタプリタおよびサイト・パケットを使用することを保証する。
  • 最後のポイントは、予期しないエラーが発生します。後でこの点を説明しますが、実際に仮想環境をどう使うかを見てみます。
    3.仮想環境を使う
    (1)仮想環境の作成
    処理中のプロジェクトのためにtest-project/という仮想環境を作成したいと仮定します。このプロジェクトは以下のディレクトリツリーを持っています。
    
    test-project/ 
    ├── data     
    ├── deliver      # Final analysis, code, & presentations 
    ├── develop      # Notebooks for exploratory analysis 
    ├── src        # Scripts & local project modules 
    └── tests 
    venvモジュールを実行する必要があります。Python標準ライブラリの一部です。
    
    % cd test-project/ 
    % python3 -m venv venv/    # Creates an environment called venv/ 
    注意:異なる環境名を「venv/」に置き換えることができます。
    ほら仮想環境が誕生しました。現在のプロジェクトは:
    
    test-project/ 
    ├── data    
    ├── deliver   
    ├── develop   
    ├── src   
    ├── tests  
    └── venv         # There it is! 
    注意:仮想環境自体がディレクトリです。
    唯一のやるべきことは、前述のシナリオを実行して環境を活性化することです。
    
    % source venv/bin/activate       
    (venv) %                # Fancy new command prompt 
    現在はアクティブな仮想環境にあります。
    私たちはいつものようにプロジェクトを処理して、プロジェクトとシステムの他の部分を完全に隔離するようにします。仮想環境では、システム範囲のサイトパケットにアクセスできず、仮想環境以外でインストールパッケージにアクセスできません。
    プロジェクトの作業を完了すると、以下のコードで環境を終了できます。
    
    (venv) % deactivate 
    %                  # Old familiar command prompt 
    (2)パッケージの取り付け
    デフォルトでは、新しい環境にのみpipとsetuptoolsをインストールします。
    
    (venv) % pip list          # Inside an active environmentPackage  Version 
    ---------- ------- 
    pip    19.1.1 
    setuptools 40.8.0 
    numpyv 1.15.3などの第三者ライブラリの特定バージョンをインストールするなら、いつものようにpipを使用することができます。
    
    (venv) % pip install numpy==1.15.3 
    (venv) % pip listPackage  Version 
    ---------- ------- 
    numpy   1.15.3 
    pip    19.1.1 
    setuptools 40.8.0 
    現在はシナリオや活動のPython shellにnumpyを導入できます。例えば、プロジェクトには以下のいくつかのラインのスクリプトtests/imports-test.pyが含まれていると仮定する。
    
    #!/usr/bin/env python3 
    import numpy as np 
    
    このスクリプトをコマンドラインから直接実行すると、次のようになります。
    
    (venv) % tests/imports-test.py      
    (venv) %                 # Look, Ma, no errors!
    成功する。スクリプトの導入numpyは故障していません。
    4.管理環境
    (1)デマンドファイル
    私たちの仕事の成果を他の人に再利用できる一番簡単な方法はプロジェクトのルートディレクトリ(トップディレクトリ)に必要なファイルを追加することです。そのためには、pip freezeを実行する必要があります。下記にインストールされている第三者のソフトウェアパッケージとそのバージョン番号があります。
    
    (venv) % pip freeze 
    numpy==1.15.3 
    出力をファイルに書き込みます。私たちはrequirements.txtと呼びます。
    
    (venv) % pip freeze > requirements.txt 
    ソフトウェアパッケージを更新したり、新しいパッケージをインストールしたりする場合は、同じコマンドでデマンドファイルを書き換えることができます。
    現在は、任意の共有項目の人は、requirements.txtファイルを使用して、システム上でプロジェクトを実行するために環境をコピーします。
    (2)コピー環境
    など――一体どうやってできましたか?
    想像してみてください。チームメイトのSaraはチームのGitHubメモリからテスト項目を削除しました。彼女のシステムにおいて、プロジェクトのカタログツリーは以下の通りです。
    
    test-project/ 
    ├── data     
    ├── deliver   
    ├── develop   
    ├── requirements.txt 
    ├── src  
    └── tests 
    
    ちょっと変わったものに気づきましたか?はい、そうですセブンv/フォルダがありません。
    私たちはすでにチームのGitHubメモリから削除しました。その存在がトラブルを引き起こす可能性があります。
    これはrequirements.txtファイルを使ってプロジェクトコードをコピーする上で重要な理由の一つです。
    テスト項目をマシンで実行するには、プロジェクトのルートディレクトリに仮想環境を作成することが必要です。
    
    Sara% cd test-project/ 
    Sara% python3 -m venv venv/ 
    pip install-r requirements.txtを使ってプロジェクトの依存項をアクティブな仮想環境にインストールします。
    
    Sara% source venv/bin/activate 
    (venv) Sara% pip install -r requirements.txt 
    Collecting numpy==1.15.3 (from -r i (line 1)) 
    Installing collected packages: numpy 
    Successfully installed numpy-1.15.3 
    
    現在、Saraシステム上のプロジェクト環境は私たちのシステムと全く同じです。綺麗じゃないですか?
    (3)トラブルシューティング
    残念なことはいつも計画通りに行われていません。いつも問題があります。特定のサイトパケットを誤って更新した後、Dependency Hellの第9段階にあることに気づき、単一のプロジェクトコードを実行できませんでした。それはそんなに悪くないかもしれません。自分が第7級にあることに気がつくかもしれません。
    どの程度自分が問題を解決しているかを発見しても、希望の最も簡単な方法はプロジェクトの仮想環境を再作成することです。
    
    % rm -r venv/              # Nukes the old environment 
    % python3 -m venv venv/         # Makes a blank new one 
    % pip install -r requirements.txt    # Re-installs 
    
    大成功を収めたのは、requirements.txtファイルのおかげで、正常に戻りました。しかし、もう一つの原因はあくまでもプロジェクトに必要書類を入れることです。
    5.仮想環境はどうやってここまでできますか?
    仮想環境に関する情報をもっと知りたいですか?例えば、活動環境はどのように正しいPythonを使ってプログラムを解釈して、どのように適切な第三者ライブラリを見つけますか?
    (1)echo$PATH
    このすべてはPATHの価値に帰結しています。何を使ってshellにPythonの実例を教えてくれますか?また、どこでウェブサイトのカバンを探していますか?ベースshellでは、PATHは多かれ少なかれこのように表現されています。
    
    % echo $PATH 
    /usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin 
    
    Python解釈器または実行.pyスクリプトを呼び出すと、shellはPATHにリストされているディレクトリを順番に検索します。Pythonのインスタンスに会うまで。PATHの最初に見つけたPythonの例を確認するには、which python 3を実行してください。
    
    % which python3 
    /usr/local/bin/python3         # Your output may differ 
    
    このPythonのインスタンスは、サイトモジュール(これはPython標準ライブラリの一部である)によって検索されても容易である。
    
    % python3              # Activates a Python shell 
    >>> import site            
    >>> site.getsitepackages()     # Points to site-packages folder['/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'] 
    
    スクリプトvenv/bin/activateを実行してPATHを修正して、shellがシステムのグローバルバイナリファイルを検索する前にプロジェクトのローカルバイナリファイルを検索します。
    
    % cd ~/test-project/ 
    % source venv/bin/activate 
    (ven) % echo $PATH~/test-project/venv/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin 
    
    今shellはプロジェクトのローカルPythonの使用方法を知っています。
    
    (venv) % which python3 
    ~/test-project/venv/bin/python3 
    
    プロジェクトのローカルサイトのカバンはどこで見つけられますか?
    
    (venv) % python3 
    >>> import site 
    >>> site.getsitepackages()['~/test-project/venv/lib/python3.7/site-packages']  # Ka-ching 
    
    (2)理知検査
    昔のtests/imports-test.py台本を覚えていますか?次のように見えます。
    
    #!/usr/bin/env python3 
    import numpy as np 
    このスクリプトをアクティブ環境で実行することができます。環境に問題がないのは、Pythonのインスタンスがプロジェクトのローカルサイトパケットにアクセスできるからです。
    プロジェクトの仮想環境の外部から実行されている同じスクリプトは何が発生しますか?
    
    % tests/imports-test.py        # Look, no active environmentTraceback (most recent call last): 
     File "tests/imports-test.py", line 3, in <module> 
      import numpy as npModuleNotFoundError: No module named 'numpy' 
    
    はい、間違いがありましたが、私たちはこうしなければなりません。そうしないと、プロジェクトの外部からプロジェクトのローカルサイトのパッケージにアクセスでき、仮想環境を持つ全体の目的を破壊するということです。エラーが発生したという事実は、私たちのプロジェクトがシステムの他の部分と完全に隔離されていることを証明しています。
    (3)環境のカタログツリー
    これらの情報を整理するのに役立つことがあります。つまり環境カタログツリーの外観をよく知ることができます。
    
    test-project/venv/        # Our environment's root directory 
    ├── bin 
    │  ├── activate              # Scripts to activate 
    │  ├── activate.csh            # our project's 
    │  ├── activate.fish           # virtual environment. 
    │  ├── easy_install 
    │  ├── easy_install-3.7 
    │  ├── pip 
    │  ├── pip3 
    │  ├── pip3.7 
    │  ├── python -> /usr/local/bin/python  # Symlinks to system-wide 
    │  └── python3 -> python3.7        # Python instances. 
    ├── include 
    ├── lib 
    │  └── python3.7 
    │    └── site-packages       # Stores local site packages 
    └── pyvenv.cfg 
    
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。