在运行Python脚本时,如何禁用Conda的库和二进制文件
下面是我的情况。我为一个特定应用安装了一个conda环境(暂称为 'myproject'),并在这个项目中处理一个脚本。该脚本需要通过C 和Fortran编译器来编译大量库。
我的问题在于,一旦我激活 'myproject' 环境,所有重要的环境变量和路径都会被修改,指向该conda环境中的libs/bin。由于源代码与conda的库和二进制之间存在不兼容,总会导致错误。下面列出了一些环境变量,但清单其实很长:
CONDA_PREFIX_1=/home/ubuntu/miniforge3
ADDR2LINE=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-addr2line
AR=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-ar
CXXFILT=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-c++filt
ELFEDIT=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-elfedit
NM=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-nm
.
.
.
CONDA_BACKUP_HOST=ip-172-31-11-184
HOST=x86_64-conda-linux-gnu
BUILD=x86_64-conda-linux-gnu
CONDA_TOOLCHAIN_HOST=x86_64-conda-linux-gnu
CONDA_TOOLCHAIN_BUILD=x86_64-conda-linux-gnu
CC=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-cc
CPP=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-cpp
GCC=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-gcc
GCC_AR=/home/ubuntu/miniforge3/envs/myproject/bin/x86_64-conda-linux-gnu-gcc-ar
.
.
.
CPPFLAGS=-DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/ubuntu/miniforge3/envs/myproject/include
CFLAGS=-march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/ubuntu/miniforge3/envs/myproject/include
LDFLAGS=-Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,--gc-sections -Wl,--allow-shlib-undefined -Wl,-rpath,/home/ubuntu/miniforge3/envs/myproject/lib -Wl,-rpath-link,/home/ubuntu/miniforge3/envs/myproject/lib -L/home/ubuntu/miniforge3/envs/myproject/lib
LDFLAGS_LD=-O2 --sort-common --as-needed -z relro -z now --disable-new-dtags --gc-sections --allow-shlib-undefined -rpath /home/ubuntu/miniforge3/envs/myproject/lib -rpath-link /home/ubuntu/miniforge3/envs/myproject/lib -L/home/ubuntu/miniforge3/envs/myproject/lib
DEBUG_CPPFLAGS=-D_DEBUG -D_FORTIFY_SOURCE=2 -Og -isystem /home/ubuntu/miniforge3/envs/myproject/include
DEBUG_CFLAGS=-march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-all -fno-plt -Og -g -Wall -Wextra -fvar-tracking-assignments -ffunction-sections -pipe -isystem /home/ubuntu/miniforge3/envs/myproject/include
build_alias=x86_64-conda-linux-gnu
host_alias=x86_64-conda-linux-gnu
这脚本在几周前工作得很好,因为我可以通过禁用环境来运行脚本,使用Ubuntu 24.04自带的Python来运行。现在脚本的功能提升了,若不禁用 'myproject' 环境我就无法运行。
我该如何避免这个混乱。禁用大量环境变量可能是解决办法,但我不确定如何实现。若有任何想法或帮助来解决这个问题,将不胜感激。
解决方案
首先,问题中描述的项目环境似乎需要更多的时间和思考。
也就是说,对你这个具体问题的一个解答是,利用Conda环境可以被编程地激活和取消激活这一特性。可以通过在 "myscript" 脚本中添加以下两行来修改。首先,运行Conda安装的激活脚本。然后使用conda deactivate命令将环境返回到其原生、Ubuntu状态。
# /opt/miniforge3/etc/profile.d/conda.sh for example
/path/to/conda/activation/script/conda.sh
conda deactivate
在编译完成后,"myscript" 脚本可以重新激活原来的Conda环境,然后继续执行剩余的代码。
# as above:
/path/to/conda/activation/script/conda.sh
conda activate myproject
我会补充一个示例脚本,因为我最终写了一个用来验证这个方法的脚本。
#!/usr/bin/env bash
# conda_install_dir="/path/to/conda/install/dir"
conda_install_dir="/opt/miniforge3"
conda_activate_dir="${conda_install_dir}/etc/profile.d"
conda_activate_script="${conda_activate_dir}/conda.sh"
# Define function to list currently active conda env
function get_active_conda_env() {
# List active conda env name (indicated by "*")
# after ignoring commented lines and parsing env name using awk
conda env list | grep -v -e "^\ *#.*$" | grep "\*" | awk -F " " '{print $1;}'
}
# Get and Display original conda env
active_conda_env="$(get_active_conda_env)"
echo "Initially Active Conda Env: \"${active_conda_env}\""
####################################################################
# Run script code, as needed, BEFORE source code compilation
####################################################################
# Deactivate Current Conda Env
source "${conda_activate_script}"
conda deactivate
echo "Deactivated Conda Env: \"$(get_active_conda_env)\""
####################################################################
# Run source code compilation here, using default Ubuntu env
####################################################################
# Reactivate Original Conda Env
source "${conda_activate_script}"
conda activate "${active_conda_env}"
echo "Final Active Conda Env: \"$(get_active_conda_env)\""
####################################################################
# Run script code, as needed, AFTER source code compilation
####################################################################
我不能完全确定自己是否正确理解了你的问题,因此在这里列出我在解读你的情况细节时所作的假设。
- 你的项目,"myproject",需要一个名为 "myproject" 的conda环境。
- 你在 "myproject" 项目中的一部分是一个脚本,我将其称为 "myscript.bash"。
- 由于未指明脚本语言,但操作系统被列为Ubuntu 24.04,我假设它是一个Bash shell脚本。
- 作为 "myproject" 项目的一部分,"myscript" 脚本在运行非编译部分的代码时需要使用 "myproject" 的conda环境。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。