HTCondor运行Python脚本成功但无输出文件及打印内容如何解决
解决步骤
你遇到的问题由多个配置疏漏共同导致,按以下顺序调整即可解决:
1. 先排查现有报错
首先查看提交目录下的condor_bin.err文件,你当前任务从开始执行到结束仅耗时1秒,远低于正常处理图像的耗时,说明脚本中途崩溃,具体错误原因会输出在err文件中。当前返回值为0属于异常状态下的异常返回,不代表脚本完整执行完成。
2. 修正Condor提交配置(test.info)
你现有配置存在3处核心问题:直接将Python脚本作为可执行文件、未传输输入图片、未指定要回传的pickle文件,修改后配置如下:
#Normal execution Universe = vanilla RequestCpus = 1 RequestGPUs = 0 RequestDisk = 150MB RequestMemory = 150MB +RequestWalltime = 100 # 取消这两行的注释,启用文件传输 should_transfer_files = YES when_to_transfer_output = ON_EXIT # 新增:指定要传输到计算节点的输入文件(你的脚本需要读取0.jpg) transfer_input_files = 0.jpg # 新增:指定要回传到初始目录的输出文件 transfer_output_files = random_dat.pickle NiceUser = true Notification = Always initialdir = /users/students/r0xxxxxx/Documents/testing_condor/ # 修改:可执行文件改为Python解释器,不要直接用py脚本作为可执行文件 # 请根据你的集群环境替换为实际python3路径,可登录集群节点执行which python3获取路径 executable = /usr/bin/python3 # 新增:给Python传入参数,-u是禁用输出缓冲,解决打印内容为空的问题 arguments = -u main.py Log = condor_bin.log Output = condor_bin.out Error = condor_bin.err Queue 1
如果你的集群节点无法直接访问初始目录的main.py,也可以把main.py加入transfer_input_files列表:transfer_input_files = 0.jpg, main.py
3. 修正Python脚本
增加容错判断,避免无报错直接崩溃:
import numpy as np import pickle import cv2 as cv import sys print('test', flush=True) # 加flush=True强制立即写入输出,避免缓冲导致内容丢失 # setup cv2 sift = cv.SIFT_create() img = cv.imread("0.jpg", cv.IMREAD_GRAYSCALE) # 新增:判断图片是否读取成功,读取失败直接抛错,方便定位问题 if img is None: print("无法读取0.jpg,请确认文件已传输", file=sys.stderr, flush=True) sys.exit(1) for i in range(25): kp, des = sift.detectAndCompute(img, None) norms = np.linalg.norm(des, axis=1) index = [] for p in kp: temp = (p.pt, p.size, p.angle, p.response, p.octave, p.class_id) index.append(temp) with open('./random_dat.pickle', 'wb') as handle: pickle.dump((123456, index, des, norms), handle) print("finished", flush=True)
调整后操作
修改完成后重新提交任务,执行完成后即可在初始目录看到非空的condor_bin.out和random_dat.pickle文件。
内容的提问来源于stack exchange,提问作者Daan Seuntjens
相关产品推荐
相关产品推荐

