在Conda环境运行Shell脚本遇python:not found等问题的求助
Conda环境下运行Shell脚本的问题解决方法
问题回顾
- 执行脚本时提示
./run_augment_data.sh: 9: python: not found,但本地终端中type python python3显示python和python3均指向Conda环境test_env的路径 - 将脚本中
python改为python3后,出现ModuleNotFoundError: No module named 'torch',实际调用的是系统路径/usr/bin/python3而非Conda环境内的Python - 在脚本顶部添加Python路径的shebang后,出现Shell命令语法错误,因为脚本被当作Python代码执行
解决方案
1. 修正脚本的解释器声明
这是核心错误:脚本是Shell脚本,必须用Shell的shebang,不能用Python的。将脚本开头改为:
#!/bin/bash
(如果使用zsh则改为#!/bin/zsh)
2. 在脚本内显式激活Conda环境
脚本独立执行时不会继承终端的Conda环境,需在脚本中添加激活命令:
source /home/rd142857/anaconda3/bin/activate test_env
若你的Conda已初始化到Shell配置文件中,也可以用conda activate test_env,但使用完整路径的activate脚本兼容性更强。
3. 处理目录删除的潜在异常
原脚本中rm -r $LOGDIR会在目录不存在时报错,可添加判断避免中断:
if [ -d "$LOGDIR" ]; then rm -r "$LOGDIR" fi
同时用mkdir -p确保父目录不存在时也能创建目标目录。
4. 统一使用环境内的Python
激活Conda环境后,直接用python即可调用环境内的解释器,无需硬编码路径,避免后续环境变动导致问题。
修改后的完整脚本
#!/bin/bash # 激活目标Conda环境 source /home/rd142857/anaconda3/bin/activate test_env LOGDIR="grappa_logs_checkpoints/ssp/" # 仅当目录存在时执行删除 if [ -d "$LOGDIR" ]; then rm -r "$LOGDIR" fi # 创建目录(包含父目录) mkdir -p "$LOGDIR" export NGPU=4; python -u -m torch.distributed.launch --nproc_per_node=$NGPU finetuning_roberta.py --train_corpus data/augment_data.txt \ --eval_corpus data/spider_dev_data_v2.txt \ --train_eval_corpus data/spider_train_data_small_v2.txt \ --bert_model roberta-large \ --output_dir "$LOGDIR/" \ --do_train \ --do_eval \ --train_batch_size 12 \ --max_seq_length 218 \ --num_train_epochs 10 \ > "$LOGDIR/log.out"
内容的提问来源于stack exchange,提问作者rd142857
相关产品推荐
相关产品推荐

