最終的に、あなたの質問は、実行中の Python が virtualenv にあるかどうかを検出する方法に関するものであるようです。virtualenv
これを理解するには、実際にどのように機能するかを理解する必要があります。
virtualenv 内でスクリプトを実行すると、activate
次の 2 つのことが行われます。
- virtualenv からのディレクトリ
PATH
を含むように環境変数を更新するため、virtualenvからバイナリを実行すると実行されます。bin
python
VIRTUAL_ENV
activate スクリプト自体がアクティベーションを追跡できるように、変数を設定します。
python
virtualenv から直接実行することはまったく問題なく、実行時には変数をまったくpython
使用しません。VIRTUAL_ENV
代わりに、実行中のpython
バイナリを含むディレクトリを特定し、親ディレクトリを「プレフィックス」として使用します。
sys
モジュールをインポートして を参照することで、システムの接頭辞を決定できますsys.prefix
。ただし、これは簡単にカスタマイズできる Python のビルド時の設定であり、プラットフォーム間で確実に異なるため、virtualenv がアクティブ化されていないときに this の値に依存することはお勧めできません。
ただし、Python には、virtualenv プレフィックスとコンパイル済みプレフィックスから実行する場合に、実行時にわずかな違いが1 つあります。パッケージには、Python バイナリにコンパイルされるプレフィックスを返すsys
追加の変数があります。real_prefix
したがって、これを使用して、Python がデフォルト以外の場所で実行されていることを認識することができます。これは、virtualenv から実行されていることを意味する可能性がかなり高いです。
import sys
if getattr(sys, "real_prefix", None) is not None:
print "Maybe in a virtualenv"
else:
print "Probably not in a virtualenv"
しかし、これでさえ正確な科学ではありません。これは、python バイナリがコンパイル時に指定された場所にないことを示しています。現在のユーザーが書き込みアクセス権を持っているかどうかはわかりません/usr/share/man
-これが正しい答えを与えない(おそらくエッジ)ケースがいくつかあります:
ユーザーがホーム ディレクトリのソースから独自の Python をコンパイルし、そのコンパイル済みプレフィックスが設定されていない/home/johnd/local-python
場合real_prefix
、ユーザーはまだ自分の Pythonlib
ディレクトリへの書き込みアクセス権を持っており、おそらくまたはへの書き込みアクセス権を持っていません。/etc
/usr/share/man
同様に、一部のシステムでは、管理者が/usr/lib/python2.7
アプリ開発者の特定のグループにグループ書き込み権限を付与して、Python モジュールをインストールできるようにしている場合がありますが、他のシステム ファイルへの書き込みアクセスは許可していません。
data_files
したがって、最終的にできる最善の方法はヒューリスティックであり、代わりに、virtualenv 内で使用されると予想されるモジュールに絶対パスを使用しないようにすることをお勧めします。妥協案として、モジュールを単純に 2 つのディストリビューションに分割することが考えられます。1 つはローカライズ可能なソース ファイルを表し、もう 1 つはそれを実行するためのシステム全体の構成を表します。後者は、ユーザーが簡単にインストールできるように前者に依存することができますが、使用しているユーザーにはvirtualenv
、他の前者を直接使用するオプションがあります。