我无法制作最小的可重现示例,因为此错误是通过 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]
我和我的系统管理员聊过,他告诉我我需要一个针对集群特定系统架构编译的 Python 解释器。
我用过
uname -a
揭示了系统架构。我不想在这里发布输出,但重要的是我尝试使用 conda 环境的服务器是 aarch64,我使用 conda 环境的架构是 x86_64。
如果解释器与架构不兼容,我只能假设至少此特定服务器的默认行为是忽略 shebang 行。