You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Anaconda虚拟环境:激活后运行脚本与直接调用Python的差异

Anaconda虚拟环境两种运行脚本方式的差异解析

嘿,我来帮你把这两种运行方式的核心差异讲明白,先纠正个小问题:你写的方式1 conda activate my_env python3 my_python_script其实是错误的语法哦,正确的写法应该是分两步执行 conda activate my_env && python3 my_python_script,或者用conda官方推荐的conda run -n my_env python3 my_python_script来模拟激活环境后的执行流程。接下来聊聊哪些场景下两种方式会产生明显差异:

  • 额外环境变量的加载差异
    激活conda环境时,除了把环境的~/anaconda3/envs/my_env/bin加入PATH,还会自动执行环境目录下etc/conda/activate.detc/conda/deactivate.d里的脚本。这些脚本通常会设置一些特定的环境变量,比如科学计算库的路径、日志级别配置(像TensorFlow的TF_CPP_MIN_LOG_LEVEL)、CUDA相关的环境变量等。而直接调用环境里的python(方式2)只会使用当前shell的原有环境变量,完全不会触发这些激活脚本的配置,如果你脚本依赖这些变量,结果就会不一样。

  • shell别名与函数的可用性
    激活环境时,conda可能会给当前shell设置一些专属别名或函数(比如部分conda工具的快捷调用命令)。如果你的Python脚本里用subprocess调用了这些别名/函数,用方式1运行时能正常识别;但方式2直接跑脚本的话,shell上下文没加载这些别名,调用就会报错。

  • 环境内可执行工具的调用差异
    要是你的脚本里用subprocess调用了安装在conda环境里的其他可执行文件(比如ffmpeggit或者其他conda安装的命令行工具),方式1激活环境后,PATH里包含了环境的bin目录,subprocess能直接找到环境内的版本;而方式2下,当前shell的PATH没更新,subprocess会去找系统默认路径里的工具,大概率会用系统版本,甚至找不到工具抛出异常。

  • conda包的激活钩子执行
    部分conda包在安装时会添加激活钩子脚本,比如mamba、一些并行计算库,激活环境时这些钩子会调整PYTHONPATH、设置OpenMP线程数等关键配置。直接调用环境python的话,这些钩子完全不会执行,可能导致库的运行行为异常(比如并行计算效率骤降、依赖找不到)。

内容的提问来源于stack exchange,提问作者Camilo

火山引擎 最新活动