print无法输出到.out文件中 用 -u

故事背景: 做BraTS项目,快要交论文初稿了,模型还不合格,心情急躁,无奈遇到了从来没见过的长相奇特的bug,又卡了好几天,内心是崩溃的…

bug描述: 在服务器上跑.py模型训练脚本,之前好好的可以跑通的代码突然什么都不输出(.out文件中没有内容),连已经运行到的print语句也没有输出内容,如下图;
bug描述1
只有当程序出现报错时,之前的print内容才会和报错信息一起显示到.out文件中,如下图。
bug描述2
解决过程:

  1. 起初看到多个任务的进度条都是 0/n 以为是学校服务器又大姨妈了(虽然学校的服务器老有各种各样的问题,但这是我debug是很忌讳的一点,第一反应是甩锅)

  2. 但等待几日之后发现服务器正常,于是开始反思是否代码中出现死循环;用print大法判断程序执行到哪一步,却发现.out文件中除了卡在0的进度条什么都不输出;

  3. 由于.out中只有进度条,让我怀疑是tqdm的问题,于是我注释掉import tqdm这行,这下.out文件中连进度条都没了… 此刻我以陷入深深的自我怀疑中。

  4. 突破点在于:当代码中出错的时候(比如cuda OOM或者文件名出错),.out文件中就会出现先前print出来的内容。 这表明代码已经运行过了那些print的位置,卡在了其他地方。

  5. 终于我开始搜索“linux,print无法输出到.out文件”相关的内容,此刻我才走在了正确的道路上。在我了解到 python的输出有缓冲机制,print的内容是先输出到缓冲区,导致out在文件中并不能够马上看到输出 。解决办法是 运行时用 -u 参数禁用缓冲区 (这也解释了在先前成功训练完的模型.out文件中,为什么print的内容在tqdm进度条之后才统一打印出)print-after-tqdm

  6. 在调用脚本时加了 -u 参数,终于看到正常的print输出,虽然进度条仍然卡在0,但我至少可以知道程序卡在了哪一步。
    bug描述3

  7. 最后发现我在util.py中写了两个名为combine_labels的函数,一个用于计算dice,一个用在predict之后, 两个函数名字是一样的。 调用 combine_labels 函数时,我本地的python解释器选择了较后定义的那个,而linux服务器上的python解释器可能傻了,于是卡在此处 (也不报错,令人头秃;或许哪位读者大神能纠正一下我的理解) 给两者之一改名后,bug终于解决。

总结: 遇到奇怪的bug别甩锅,也别在自我怀疑中浪费太多时间。如果一时三刻解决不了就先做点别的事。 尝试了几种可能性行不通也别焦躁和气馁,做好记录工作,慢慢将每种可能性都排除了问题就有可能迎刃而解。 关键还有多google。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
import numpy as np import pandas as pd import time import matplotlib.pyplot as plt # 指定文件名 inputFilename = './file.dpmrpt' outputFilename = 'out' # 分组数 N = 101 sm = 1.3e-4 # 计时开始 tic = time.time() # 规范化数据 print('规范化数据...') content = '' with open(inputFilename) as f: content = f.read() content = content.replace( '(', '' ) content = content.replace( ')', '' ) content = content.replace( 'injection-0:', '' ) # 输出文件名 filename = './file.dpmrpt.csv' print('规范化写出到{}!'.format( filename ) ) with open(filename,'w') as csv: csv.write(content) print('规范化完成!') # 加载规范化后的数据 print('加载规范化后的数据...') data = np.loadtxt(filename, skiprows=17)#读取文件并跳过前两行数据 x, y, z, u, v, w, ve = data[:,1], data[:,2], data[:,3], data[:,4], data[:,5], data[:,6], data[:,7] bin = np.linspace(x.min(), x.max(), N)#创建等差数列,将X分成N个组 out = np.zeros((N-1,7))#out为N-1行,4列矩阵 z_sym = z.copy() z_sym = -z_sym z = np.concatenate((z,z_sym))/0.002 x = np.concatenate((x,x))/0.002 y = np.concatenate((y,y))/0.002 u = np.concatenate((u,u)) print('横截面平均完成。') from mpl_toolkits.mplot3d import Axes3D fig = plt.figure(figsize=(12,10)) #ax1 = plt.axes(projection='3d') s1 = 1e-2 c1 = 40.0*u ax = fig.add_subplot(111,projection='3d') #这种方法可以画多个子图 ax.scatter3D(x, z, y, s = s1, c = c1, cmap='plasma',marker = ',') ax.set_xlabel('x/D', fontname='Times New Roman') ax.set_ylabel('z/D', fontname='Times New Roman') ax.set_zlabel('y/D', fontname='Times New Roman') ax.set_xlim([-15.0,30.0]) ax.set_ylim([-10.0,10.0]) ax.set_zlim([0.0,25.0]) ax.set_box_aspect(aspect=(45,20,25)) ax.tick_params(axis='x', which='major', pad=8, labelsize=8) ax.tick_params(axis='y', which='major', pad=8, labelsize=8) ax.tick_params(axis='z', which='major', pad=8, labelsize=8) plt.show() # 计时结束 toc = time.time() print('Time cost {} s'.format(toc-tic )) print('结束'),如何调整输出的三维图到合适的视角
最新发布
06-12

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值