通过 PBS 提交时,Conda 作为 bash 脚本执行

问题描述 投票:0回答:1

我无法制作最小的可重现示例,因为此错误是通过 PBS 作业管理器提交到服务器时出现的。

qsub -N $JOBNAME -S /bin/bash -j y -o ~/Projects/JOBS/$JOBNAME.out << EOF
#!/bin/bash
echo "/////////////////////////////////////"

# Initialize conda for bash

source ~/anaconda3/etc/profile.d/conda.sh

# Check if conda is activated correctly
which python
which conda
conda list

echo "/////////////////////////////////////"
EOF

提交后日志文件显示conda是在bash中执行的,而不是python

alexmarc@lome /S/a/t/JOBS> cat reinventTest.out                                                (reinvent4) 
/////////////////////////////////////
/bin/python
~/tools/anaconda3/condabin/conda
~/tools/anaconda3/bin/conda: line 3: import: command not found
~/tools/anaconda3/bin/conda: line 6: syntax error near unexpected token `sys.argv'
~/tools/anaconda3/bin/conda: line 6: `if len(sys.argv) > 1 and sys.argv[1].startswith('shell.') and sys.path and sys.path[0] == '':'
/////////////////////////////////////

在我的 shell 中执行类似的命令:

alexmarc@lome /S/a/t/P/r/fromDost> which python ; which conda                               (base) 
~/tools/anaconda3/bin/python
~/tools/anaconda3/bin/conda
alexmarc@lome /S/a/t/P/r/fromDost>      

我可以找到 conda,但找不到我的基本 python 可执行文件。我怀疑我的 python 安装无法在服务器上运行。 conda 可执行文件中的 shebang 行包含 conda 基本环境的路径(请参阅编辑 2)。我的直觉是 conda 使用我的 $SHELL 执行,因为它无法使用所述基本 python 可执行文件。

因为我从未观察到当 shebang 行指向某个 python 解释器时,python 脚本会自动作为 bash 脚本执行,所以我想我应该在这里发帖,看看是否有人可以识别导致此行为的原因。

编辑:我在工作开始时和工作结束时检查了我提交的集群中的 $PATH。在任何这些情况下 $PATH 都不会改变

我还看到我的 conda 可执行文件设置正确:

+ source ~/tools/anaconda3/etc/profile.d/conda.sh
++ export CONDA_EXE=~/tools/anaconda3/bin/conda
++ CONDA_EXE=~/tools/anaconda3/bin/conda

并且 python 可执行文件也在设置中:

++ CONDA_PYTHON_EXE=~/tools/anaconda3/bin/python

使用@Charles Duffy建议的方法再次检查python版本

+ which python
/bin/python
+ type python
python is /bin/python

诡异...

我在下面设置 set -x 后发布了完整的输出

+ which python
/bin/python
+ type python
python is /bin/python
+ command -v python
/bin/python
+ type python3
python3 is /bin/python3
+ command -v python3
/bin/python3
+ which conda
~/tools/anaconda3/condabin/conda
+ conda list
+ local cmd=list
+ case "$cmd" in
+ __conda_exe list
+ ~/tools/anaconda3/bin/conda list
~/tools/anaconda3/bin/conda: line 3: import: command not found
~/tools/anaconda3/bin/conda: line 6: syntax error near unexpected token `sys.argv'
~/tools/anaconda3/bin/conda: line 6: `if len(sys.argv) > 1 and sys.argv[1].startswith('shell.') and sys.path and sys.path[0] == '':'

编辑2:

这是我的 conda 可执行文件的头部,按照 Ljm Dullaart 的要求

alexmarc@lome ~/JOBS> head ~/tools/anaconda3/bin/conda              (base) 
#!~/tools/anaconda3/bin/python
# -*- coding: utf-8 -*-
import sys
# Before any more imports, leave cwd out of sys.path for internal 'conda shell.*' commands.
# see https://github.com/conda/conda/issues/6549
if len(sys.argv) > 1 and sys.argv[1].startswith('shell.') and sys.path and sys.path[0] == '':
    # The standard first entry in sys.path is an empty string,
    # and os.path.abspath('') expands to os.getcwd().
    del sys.path[0]
bash conda pbs
1个回答
0
投票

我和我的系统管理员聊过,他告诉我我需要一个针对集群特定系统架构编译的 Python 解释器。

我用过

uname -a

揭示了系统架构。我不想在这里发布输出,但重要的是我尝试使用 conda 环境的服务器是 aarch64,我使用 conda 环境的架构是 x86_64。

如果解释器与架构不兼容,我只能假设至少此特定服务器的默认行为是忽略 shebang 行。

© www.soinside.com 2019 - 2024. All rights reserved.