我在一个CMakeLists.txt
文件中有以下内容。我试图使用cmake来检查系统上是否安装了名为myenv
的conda环境,并激活了该环境。如果环境不存在,则创建环境并激活它。这假设conda已经通过蟒蛇 (或Miniconda)安装。
# Create and activate a Python environment.
cmake_minimum_required(VERSION 3.18)
# Define the project
project(MyExample)
# Specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Make sure Python is installed
find_package(Python REQUIRED)
# Activate conda environment, assume Anaconda or Miniconda is already installed
if(EXISTS /opt/miniconda3/envs/myenv)
execute_process(COMMAND conda activate myenv)
else()
execute_process(COMMAND conda create --yes --quiet --name myenv python)
execute_process(COMMAND conda activate myenv)
endif()
当我运行上面的cmake文件时,我得到了错误:
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
但是,conda安装在我的系统上,我可以在终端中手动激活环境。为什么不通过cmake激活环境?
发布于 2022-06-02 17:05:27
“为什么不通过cmake激活环境?”
第一个问题是错误消息,它表示CMake计算execute_process
命令的shell不知道conda activate
是什么意思。
这可能是因为conda init <shell>
从未针对CMake使用的特定shell (bash?)运行过。这个答案有一些关于conda init
做什么的细节。这也可能是因为定义conda activate
的Conda初始化代码只加载在交互式shell中--我不希望CMake使用它。在交互式shell (bash -l -c 'conda activate foo'
)中可能存在强制执行的黑客方式,但这并不重要,因为.
即使上面的操作正常,这里的过程也没有意义: Conda环境的激活状态被限定为shell进程。我预计(子)外壳会随着execute_process
的完成而死亡。因此,即使激活有效,它也不会在CMake脚本中继续存在。
讨论
通常,这个CMake脚本似乎不是一个好方法。在用户级别上,将代码的编译与特定命名的Conda环境的存在紧密耦合,似乎违背了CMake的精神,后者的目的是自动发现软件依赖关系,这样用户就不需要通常的硬编码位置。也许有必要重新评估正在努力实现的目标以及实现这一目标的策略。
例如,在Conda上,很多包都是用CMake编译的,但是CMake是在已经激活的环境中执行的,而它本身对Conda一无所知。这使得CMake代码完全不知道它的依赖项是如何提供的,我认为这是一种更干净的工程。
https://stackoverflow.com/questions/72453930
复制相似问题