1. ホーム
  2. python

[解決済み] Pythonがvirtualenv内で実行されているかどうかを判断する

2022-03-14 14:23:06

質問

現在のスクリプトがvirtualenv環境内で実行されているかどうかを判断することはできますか?

どのように解決するのですか?

最も信頼性の高い確認方法は、以下のように sys.prefix == sys.base_prefix . これらが等しければ、仮想環境にいないことになり、不等であれば、仮想環境にいることになります。仮想環境の中にいる sys.prefix は仮想環境を指し示し sys.base_prefix は virtualenv が作成されたシステム Python の接頭辞です。

上記は Python 3 stdlib では常に動作します。 venv と最近の virtualenv (バージョン20以降)です。古いバージョンの virtualenv 使用される sys.real_prefix の代わりに sys.base_prefix (そして sys.real_prefix は仮想環境の外には存在しなかった)、Python 3.3 以前では sys.base_prefix は存在しなかった。したがって、これらのケースをすべて処理する完全に堅牢なチェックは、次のようになります。

import sys

def get_base_prefix_compat():
    """Get base/real prefix, or sys.prefix if there is none."""
    return getattr(sys, "base_prefix", None) or getattr(sys, "real_prefix", None) or sys.prefix

def in_virtualenv():
    return get_base_prefix_compat() != sys.prefix

サポートされているPythonのバージョンと最新のものだけに関心がある場合 virtualenv に置き換えることができます。 get_base_prefix_compat() を単純に sys.base_prefix .

を使用することで VIRTUAL_ENV 環境変数は信頼できません。設定されるのは、virtualenv activate シェルスクリプトを使用しますが、virtualenv を起動せずに使用するには、virtualenv の bin/ (または Scripts ) ディレクトリの場合 $VIRTUAL_ENV は設定されません。あるいは、シェルで virtualenv を有効にしている間に非 virtualenv の Python バイナリを直接実行することができます。 $VIRTUAL_ENV は、実際にはそのvirtualenvで実行されていないPythonプロセスで設定されるかもしれません。