web-dev-qa-db-ja.com

コードが実行されているconda環境の名前を見つけるにはどうすればよいですか?

実行中のコードまたはインタラクティブなpythonインスタンスから、自分が入っているconda環境の名前を把握する良い方法を探しています。

ユースケースは、Python 2とPython 3 minicondaインストールからのカーネル。両方ともデフォルト環境はPy3です。Jupyterノートブックを実行しています。 Py2の個別の環境ノートブックファイル内で_conda install foo_を試してほしい。プログラム化されたcondaの同等物が見つからないので、今のところsubcommandを使用してこれを行うpip.main(['install','foo'])の。

問題は、Py2カーネルを使用してノートブックが実行されている場合、fooをインストールするためにコマンドがPy2環境の名前を知る必要があることです。その情報がなければ、デフォルトのPy3環境にインストールされます。コードがどの環境にあるのか、それ自体の正しい名前を把握したいのです。

私がこれまでに得た最良の解決策は次のとおりです。

_import sys

def get_env():
    sp = sys.path[1].split("/")
    if "envs" in sp:
        return sp[sp.index("envs") + 1]
    else:
        return ""
_

これを達成するためのより直接的/適切な方法はありますか?

20
Alnilam

$CONDA_DEFAULT_ENVまたは$CONDA_PREFIXが必要です:

$ source activate my_env
(my_env) $ echo $CONDA_DEFAULT_ENV
my_env

(my_env) $ echo $CONDA_PREFIX
/Users/nhdaly/miniconda3/envs/my_env

$ source deactivate
$ echo $CONDA_DEFAULT_ENV  # (not-defined)

$ echo $CONDA_PREFIX  # (not-defined)

Pythonの場合:

In [1]: import os
   ...: print os.environ['CONDA_DEFAULT_ENV']
   ...:
my_env

環境変数は十分に文書化されていません。ここで言及されているCONDA_DEFAULT_ENVを見つけることができます: https://www.continuum.io/blog/developer/advanced-features-conda-part-1

見つけることができたCONDA_PREFIXに関する唯一の情報は、この問題です。 https://github.com/conda/conda/issues/2764

44
NHDaly

私はこれを使用しています:

import sys
sys.executable.split('/')[-3]

envがパス内にある(そしてenvsの下にネストされている)と仮定しないという利点があります。また、source activateを介して環境をアクティブ化する必要もありません。

編集:Windowsでも機能することを確認したい場合:

import sys
from pathlib import Path
Path(sys.executable).as_posix().split('/')[-3]

明確にするために:sys.executableは、現在のpythonインタープリター(アクティブ化/非アクティブ化に関係なく)-たとえば'/Users/danielsc/miniconda3/envs/nlp/bin/python'のパスを提供します。残りのコードは最後のパスセグメントから3番目、これは環境があるフォルダーの名前であり、通常はpython環境の名前でもあります。

3

非常に簡単に、あなたはできる

envs = subprocess.check_output('conda env list').splitlines()
active_env = list(filter(lambda s: '*' in str(s), envs))[0]
env_name = str(active_env).split()[0]
2
Ivo

編集:おっと、気づかなかった Ivo の答え。私はそれを少し拡大しているとしましょう。


ターミナルからpythonスクリプトを実行する場合:

import os
os.system("conda env list")

これは、conda env listを使用した端末からのように、すべてのconda環境をリストします。

やや良い:

import os
_ = os.system("conda env list | grep '*'")

_ =ビットは、os.system(成功した場合は0)の呼び出しの存在ステータスを黙らせ、grepはアクティブ化されたconda環境の行のみを出力します。

端末からスクリプトを実行しない場合(たとえば、crontabを介してスケジュールされている場合)、上記には結果を「印刷」する場所がありません。代わりに、Pythonのsubprocessモジュールのようなものを使用する必要があります。最も簡単な解決策はおそらく実行することです:

import subprocess
output = subprocess.check_output("conda env list | grep '*'", Shell=True, encoding='utf-8')
print(output)

つまり、outputは、終了ステータスではなく、conda env listコマンドのoutputを含む文字列です(これも取得できます。subprocessモジュールのドキュメントを参照してください) )。

アクティブ化されたconda環境に関する情報を含む文字列が作成されたので、質問に記載されているインストールを実行する(または実行しない)ために必要なテストを(正規表現を使用して)実行できます。

備考
もちろん、上記のブロックのprint(output)は、スクリプトが端末から実行されていない場合は効果がありませんが、端末から実行するスクリプトでブロックをテストする場合は、あなたが望むものを提供することを確認してください。たとえば、この情報をログファイルに出力できます(loggingモジュールを使用することをお勧めします)。

1
Antoine

「python環境」をどのように判断するのか」に関連する同様の検索がこの答えにつながるので、現在コードを実行している環境を見つける方法についても言及すると思いました。 現在の環境内のlocationを指すmy pip binaryの場所次のコマンドの出力を見れば、簡単に判断できます現在の環境。(グローバル環境/他の環境からpipパッケージを継承している場合、このソリューションは適用できないことに注意してください)

InWindowsコマンドプロンプト:

where pip

Jupyter Notebook内にいる場合、コマンドの前に感嘆符(!)を追加して、ホストコマンドプロンプトでコマンドを実行します。

in[10]: !where pip

出力は次のようになります。

C:\Users\YourUsername\.conda\envs\YourEnvironmentName\Scripts\pip.exe
C:\ProgramData\Anaconda3\Scripts\pip.exe

YourEnvironmentNameは、現在の環境の名前を提供します。

Linux/Macでは、whereの代わりにwhichコマンドを使用できます:(テストなし)。

Python3環境の場合

which pip3

Jupyterノートブックから

in[10]: !which pip3

これは、現在の環境内の場所を直接指す必要があります。

1
codeslord

Windows(Linuxで動作する可能性がありますが、テストされていません):

import sys
import os

# e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
print( sys.exec_prefix.split(os.sep)[-1] )

環境変数を使用するか、パス区切り文字が「/」であると仮定すると、Windows/Anaconda3環境では機能しませんでした。

これは、環境にいることを前提としています。

0
MZB