在SLURM集群中,我正在提交一个调用python脚本的shell脚本(这两个脚本都可以在下面找到。当执行shell脚本时,直到调用python脚本为止,然后什么都没有发生:没有输出,没有错误消息,并且SLURM作业继续运行。
我假设python脚本的所有内容都不相关(但我还是将其包括在内以完成操作)。出于调试目的,我在开始时插入了print("script started")
行,以查看它是否可以运行但没有运行。我在输出中看到的最后一件事是moved to directory
。
我尝试在此之前调用包含test.py
的{{1}}脚本,该脚本可以正常执行。
python脚本无法启动的原因可能是什么,我该如何解决?
编辑:由于jakub用户建议成功将print("test")
更改为print("script started")
,因此需要打印。包括另外几条这些语句表明该脚本实际上运行得很好,只是没有输出任何内容。在for循环中包含不断执行的同一条语句,也会使以前缺少的所有print("script started", flush=True)
条语句得到打印。
然后问题变成:为什么这里的print()
语句需要在此脚本中有print()
,而在其他脚本中没有{1>}?
Shell脚本:
flush=True
Python脚本:
#!/bin/bash
#SBATCH --mail-user=lukas.baehler@pathology.unibe.ch
#SBATCH --mail-type=end,fail
#SBATCH --output=out-ncl
#SBATCH --error=err-ncl
#SBATCH --job-name="Mask RCNN nucleus training and detection"
#SBATCH --time=24:00:00
#SBATCH --partition=gpu
#SBATCH --mem-per-cpu=64G
#SBATCH --gres=gpu:gtx1080ti:1
#SBATCH --constraint=rtx2080
conda init bash
source ~/.bashrc
conda activate nucl
cd MRCNN/samples/nucleus
echo "moved to directory"
python nucleus-pipeline2.py splitTMA
echo "Split TMAs"
答案 0 :(得分:0)
Python默认情况下会缓冲stdin,stdout和stderr。 print()
默认情况下写入stdout
,因此您将看到此缓冲行为。
来自https://stackoverflow.com/a/14258511/5666087:
Python以缓冲模式打开stdin,-out和-error流;它会读取或写入更大的块,将数据保留在内存中,直到达到阈值为止。
您可以通过将flush=True
传递到print
来强制刷新此缓冲区。有关更多信息,请参见the documentation。如果连续有多个print
语句,则只需在最后一个语句中使用flush=True
。