web-dev-qa-db-ja.com

pythonスクリプト内でconda installを使用する

これによると answer Pythonスクリプト内からpipをインポートし、それを使用してモジュールをインストールできます。これをconda installで行うことは可能ですか?

Condaのドキュメントはコマンドラインからの例のみを示していますが、Pythonスクリプト内から実行できるコードを探しています。

はい、スクリプト内からシェルコマンドを実行することはできますが、基本的にcondaをインポートできず、その関数を呼び出すことができないため、これを回避しようとしています。

17
slaw

conda.cli.mainを使用できます。たとえば、これはnumpyをインストールします。

import conda.cli

conda.cli.main('conda', 'install',  '-y', 'numpy')

インタラクティブな質問を回避するには、-y引数を使用します。

-y、-yes確認を求めません。

18
Mike Müller

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はかなり遅いコマンドなので、サブプロセスを呼び出すことによるパフォーマンスへの影響を心配する必要はないと思います。別のコメントで述べたように、pipcondaと同様のツールであり、明示的に Pythonにインポートするのではなく、サブプロセスとして呼び出す必要があることを示すドキュメント

1
ws_e_c421