これによると answer Pythonスクリプト内からpipをインポートし、それを使用してモジュールをインストールできます。これをconda install
で行うことは可能ですか?
Condaのドキュメントはコマンドラインからの例のみを示していますが、Pythonスクリプト内から実行できるコードを探しています。
はい、スクリプト内からシェルコマンドを実行することはできますが、基本的にcondaをインポートできず、その関数を呼び出すことができないため、これを回避しようとしています。
conda.cli.main
を使用できます。たとえば、これはnumpy
をインストールします。
import conda.cli
conda.cli.main('conda', 'install', '-y', 'numpy')
インタラクティブな質問を回避するには、-y
引数を使用します。
-y、-yes確認を求めません。
Pythonスクリプトからしばらくの間conda
を使用してきたので、conda
モジュールを使用してsubprocess
を呼び出すのが全体的に最も効果的だと思います。 Python 3.7+、次のようなことができます:
_import json
from subprocess import run
def conda_list(environment):
proc = run(["conda", "list", "--json", "--name", environment],
text=True, capture_output=True)
return json.loads(proc.stdout)
def conda_install(environment, *package):
proc = run(["conda", "install", "--quiet", "--name", environment] + packages,
text=True, capture_output=True)
return json.loads(proc.stdout)
_
コメントで指摘したように、conda.cli.main()
は外部で使用するためのものではありませんでした。これは_sys.argv
_を直接解析するので、独自のコマンドライン引数を使用して独自のスクリプトで使用しようとすると、conda.cli.main()
にもフィードされます。
_conda.cli.python_api
_を示唆する@YenForYangの回答は、これがconda
コマンドを呼び出すための公開ドキュメントAPIであるため、より適切です。しかし、それでもまだ荒いエッジを持っています。 conda
は、コマンド(キャッシュなど)を実行するときに内部状態を構築します。 condaが通常使用され、通常テストされる方法は、コマンドラインプログラムとしてです。その場合、この内部状態はconda
コマンドの最後で破棄されます。 _conda.cli.python_api
_を使用すると、単一のプロセス内で複数のconda
コマンドを実行できます。この場合、内部状態が引き継がれ、予期しない結果が生じることがあります(コマンドが実行されると、キャッシュが古くなるなど)。もちろん、conda
がこの内部状態を直接処理できるようにする必要があります。私のポイントは、conda
をこのように使用することが開発者の主な焦点ではないということです。最も信頼性の高い方法が必要な場合は、conda
を開発者が意図したとおりに、独自のプロセスとして使用してください。
conda
はかなり遅いコマンドなので、サブプロセスを呼び出すことによるパフォーマンスへの影響を心配する必要はないと思います。別のコメントで述べたように、pip
はconda
と同様のツールであり、明示的に Pythonにインポートするのではなく、サブプロセスとして呼び出す必要があることを示すドキュメント 。