在python脚本中使用conda install

时间:2017-01-20 15:39:10

标签: python installation anaconda conda

根据此answer,您可以从Python脚本中导入pip并使用它来安装模块。是否可以使用conda install执行此操作?

conda文档仅显示命令行中的示例,但我正在寻找可以在Python脚本中执行的代码。

是的,我可以从脚本中执行shell命令,但我试图避免这种情况,因为它基本上假设无法导入conda并调用其函数。

6 个答案:

答案 0 :(得分:13)

您可以使用conda.cli.main。例如,这会安装numpy

import conda.cli

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

使用-y参数来避免交互式问题:

  

-y, - 是不要求确认。

答案 1 :(得分:1)

我在查看最新的Conda Python API时发现实际上只有两个具有“非常长期稳定性”的公共模块:

  1. conda.cli.python_api
  2. conda.api

对于您的问题,我会处理第一个问题:

注意:下面的run_command()总是添加一个-y / --yes选项(即它不会询问确认

import conda.cli.python_api as Conda
import sys

###################################################################################################
# The below is roughly equivalent to:
#   conda install -y 'args-go-here' 'no-whitespace-splitting-occurs' 'square-brackets-optional'

(stdout_str, stderr_str, return_code_int) = Conda.run_command(
    Conda.Commands.INSTALL, # alternatively, you can just say "install"
                            # ...it's probably safer long-term to use the Commands class though
                            # Commands include:
                            #  CLEAN,CONFIG,CREATE,INFO,INSTALL,HELP,LIST,REMOVE,SEARCH,UPDATE,RUN
    [ 'args-go-here', 'no-whitespace-splitting-occurs', 'square-brackets-optional' ],
    use_exception_handler=True,  # Defaults to False, use that if you want to handle your own exceptions
    stdout=sys.stdout, # Defaults to being returned as a str (stdout_str)
    stderr=sys.stderr, # Also defaults to being returned as str (stderr_str)
    search_path=Conda.SEARCH_PATH  # this is the default; adding only for illustrative purposes
)
###################################################################################################


使用上述内容的好处是,它解决了使用conda.cli.main()时出现的问题(在上面的注释中提到):

  

... conda试图解释comand行参数而不是conda.cli.main()的参数,因此像这样使用conda.cli.main()可能在某些情况下不起作用。


上面评论中的另一个问题是:

  

该频道不是默认频道时如何[安装软件包]?

import conda.cli.python_api as Conda
import sys

###################################################################################################
# Either:
#   conda install -y -c <CHANNEL> <PACKAGE>
# Or (>= conda 4.6)
#   conda install -y <CHANNEL>::<PACKAGE>

(stdout_str, stderr_str, return_code_int) = Conda.run_command(
    Conda.Commands.INSTALL,
    '-c', '<CHANNEL>',
    '<PACKAGE>'
    use_exception_handler=True, stdout=sys.stdout, stderr=sys.stderr
)
###################################################################################################

答案 2 :(得分:0)

使用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()

@YenForYang的建议conda.cli.python_api更好,因为这是一个公开记录的用于调用conda命令的API。但是,我认为它仍然具有粗糙的边缘。 conda在执行命令(例如缓存)时会建立内部状态。通常使用conda并对其进行测试的方法是作为命令行程序。在这种情况下,此内部状态在conda命令的末尾将被丢弃。使用conda.cli.python_api,您可以在一个进程中执行多个conda命令。在这种情况下,内部状态会延续下去,有时会导致意外的结果(例如,随着命令的执行,缓存变得过时了)。当然,conda应该可以直接处理此内部状态。我的意思是,以这种方式使用conda并不是开发人员的主要重点。如果您想要最可靠的方法,请按照开发人员预期的方式使用conda-作为自己的过程。

conda是一个相当慢的命令,因此我不认为应该担心调用子进程对性能的影响。正如我在另一条评论中指出的那样,pipconda类似,并且在its documentation that it should be called as a subprocess, not imported into Python中有明确说明。

答案 3 :(得分:0)

我为我努力的最简单的事情是:

import os

try:
    import graphviz
except:
    print ("graphviz not found, Installing graphviz ")
    os.system("conda install -c anaconda graphviz")
    import graphviz

并确保您以管理员身份运行脚本。

答案 4 :(得分:0)

我知道这个问题已经过时了,但是我发现conda.cli.python_apiconda.api受到限制,因为它们都没有执行以下命令的选项:

conda export env > requirements.txt

因此,我改为使用带有标志shell=True的子流程来完成工作。 subprocess.run(f"conda env export --name {env} > {file_path_from_history}",shell=True),其中env是要保存到requirements.txt的环境的名称。

希望这对某人有帮助。

答案 5 :(得分:-2)

试试这个:

!conda install xyzpackage

请记住,这必须在Python脚本中完成,而不是在操作系统提示符下完成。

否则您可以尝试以下方法:

导入系统 来自conda.cli import main

sys.exit(main())

try:
    import conda
    from conda.cli import main
    sys.argv = ['conda'] + list(args)
    main()