根据此answer,您可以从Python脚本中导入pip并使用它来安装模块。是否可以使用conda install
执行此操作?
conda文档仅显示命令行中的示例,但我正在寻找可以在Python脚本中执行的代码。
是的,我可以从脚本中执行shell命令,但我试图避免这种情况,因为它基本上假设无法导入conda并调用其函数。
答案 0 :(得分:13)
您可以使用conda.cli.main
。例如,这会安装numpy
:
import conda.cli
conda.cli.main('conda', 'install', '-y', 'numpy')
使用-y
参数来避免交互式问题:
-y, - 是不要求确认。
答案 1 :(得分:1)
我在查看最新的Conda Python API时发现实际上只有两个具有“非常长期稳定性”的公共模块:
conda.cli.python_api
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
是一个相当慢的命令,因此我不认为应该担心调用子进程对性能的影响。正如我在另一条评论中指出的那样,pip
与conda
类似,并且在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_api
和conda.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()