Pip -tはシンプルなvirtualenvの代替です

TL; DR


プロジェクトの依存関係を単純にインストールして分離するために、 virtualenvは多くの場合、難しい決定です。 簡単な代替手段を提供します。
  1. ./.pipPYTHONPATH環境変数に追加します。
  2. pip install -t .pipを使用してパッケージをローカルにインストールします。
  3. プロジェクトフォルダーからpythonを実行します。


今日はどのバージョンが必要ですか?


依存関係のインストールは、ほとんどすべてのPythonアプリケーションにとって必須です。 各アプリケーションは異なるライブラリに依存しています。正しい動作を保証するには、正確に正しいライブラリバージョンをインストールすることをお勧めします。

一般的な方法は、 requirements.txtファイルをプロジェクトに含めることrequirements.txt 。 このファイルには、プロジェクトが依存するすべてのライブラリとバージョン番号がリストされています。 ファイルが適切な場所にある場合、依存関係のインストールは簡単です。
 $ pip install -r requirements.txt 

これまでのところ良い。 依存関係が競合するプロジェクト2つ以上ある場合、問題が発生します。 プロジェクトAがライブラリXバージョン0.1、プロジェクトB 0.2でのみ動作するとします。 デフォルトでは、pipはライブラリをPythonインタープリターフォルダーにグローバルにインストールします。 つまり、 $ pip install X==0.2コマンドは、 すべてのプロジェクトにXバージョン0.2ライブラリをインストールし、バージョン0.1が既にインストールされている場合は上書きします。 AとBを切り替えると、毎回Xをグローバルに再インストールすることになり、長くて不便です。

太陽の下の島


この一般的な問題に対する一般的なソリューションは、 仮想環境です。 virtualenvフレームワークは、孤立したPython環境を作成します。 各プロジェクトの依存関係は互いに分離されています。 どういうわけか、virtualenvは一部のユーザーにとって複雑すぎるようです。 したがって、 virtualenvの機能を拡張して使いやすくするvirtualenvwrapperautoenvなどのパッケージがあります。 その他のソリューション: Anaconda environmentsとPython標準ライブラリ(3.3+)のpyvenv。

これらはすべて優れたツールですが、単純で一般的なタスクに対してかなり重くて複雑なソリューションを提供するように思われました。

Javaの世界では、 npmBowerはシンプルで信頼性の高い強力なパッケージ管理を提供しますが、これはPythonには欠けているようです。 成功の鍵は、正しいバージョンの正しいライブラリをダウンロードし、プロジェクト内の特別なフォルダーに入れることです。 ダウンロードしたライブラリは、特定のプロジェクトにのみ適用されます。 これにより、上記の問題が自動的に解消されます。

純粋な魔法


PythonでnpmとBowerのアプローチを繰り返す簡単な方法があることがわかりました。

次に、プロジェクトフォルダーからコードを実行します。 source env/bin/activatedeactivate忘れてください!

./.pipは相対パスであるため、フォーカスが機能します。 その結果、 ~/dev/project_aからpythonを実行すると、このPythonインスタンスのライブラリフォルダーのリストに~/dev/project_a/.pip含まれます。 ~/dev/project_b pythonを実行します~/dev/project_b/.pipます。 レセプションは、すべての一般的なプラットフォーム(Linux、Mack、Windows)で機能します。

もちろん、 .pipフォルダーの名前は.pipです。 pip_componentsまたはlibs pip_componentslibsます。 ただし、 .pip高速に印刷され、先頭のドットはLinuxおよびMacでフォルダーを非表示にします。

ステップ1:PYTHONPATHをインストールする




ステップ2: pip -tを使用してパッケージをインストールする


PYTHONPATHがインストールされたので、pipを使用して適切な場所にパッケージをインストールするだけです。 これを行うには、 -tまたは--target使用します。
 $ cd project_a project_a$ pip install requests==2.7.0 -t .pip project_a$ python >>> import requests >>> requests.__version__ '2.7.0' 

異なるバージョンの別のプロジェクトで同じこと:
 $ cd project_b project_b$ pip install requests==2.6.0 -t .pip project_b$ python >>> import requests >>> requests.__version__ '2.6.0' 

requirements.txtファイルですべてが同じように機能します:
 $ pip install -r requirements.txt -t .pip 


潜在的な待ち伏せ


さまざまなPythonインタープリター


別のPythonインタープリターでプログラムを簡単に実行できます。
 $ /path/to/python main.py 

ただし、 2to3を使用したインストール中にソースコードをコンパイルするパッケージを使用する場合、Python 2と3の切り替えには問題があります。 このようなパッケージには単一のコードベースがありません;インストール中に、コードはPythonのアクティブバージョンに従って生成されます。

この場合、 .pip3などのフォルダーを作成し、Python 3コードを実行するときにPYTHONPATHの先頭に追加します。

easy_install


easy_installでパッケージをグローバルにインストールしている場合、問題が発生します:easy_installはsys.pathの先頭にそのようなパッケージへのパスを追加するため、 sys.pathからのパッケージよりも優先されます。

解決策は、easy_installを通じてグローバルにインストールされたパッケージを取り除くことです。

.pipの使用を妨げるものがないことを確認するには、Pythonでimport sys;sys.path実行します。 ./.pip前に他のパス./.pip場合、最初にグローバルeasy_installパッケージのシステムをクリーンアップする必要があります。

Source: https://habr.com/ru/post/J261263/


All Articles