実行中のコードまたはインタラクティブな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 ""
_
これを達成するためのより直接的/適切な方法はありますか?
$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
私はこれを使用しています:
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環境の名前でもあります。
非常に簡単に、あなたはできる
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]
編集:おっと、気づかなかった 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
モジュールを使用することをお勧めします)。
「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
これは、現在の環境内の場所を直接指す必要があります。
Windows(Linuxで動作する可能性がありますが、テストされていません):
import sys
import os
# e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
print( sys.exec_prefix.split(os.sep)[-1] )
環境変数を使用するか、パス区切り文字が「/」であると仮定すると、Windows/Anaconda3環境では機能しませんでした。
これは、環境にいることを前提としています。