重定向中断输出(Python 脚本)

重定向中断输出(Python 脚本)

我也在运行同样的python 脚本多次重定向输出以不同的方式并得到输出损坏。有时线路缺失有时顺序颠倒了。 python 脚本包含许多我想打印到输出文件的打印语句。

首先让我向您展示输出应该是什么样子:

Number of haplotypes: 400000,400000,400000
Number of trees: 2946715
Number of mutations: 3454912
Sequence length: 62949445.0
True PRS read from file: ../data/prs_true/prs.prs_true. 600000 lines imported.
Defining cases/controls [2020-07-27 23:26:09]
Case control variables saved to ../data/case_control/c_c.case_control.pickle.
End

运行A:我正在使用默认输出运行脚本:我的屏幕。打印语句的顺序是正确的,但缺少最后两条打印语句:

(genPy2) [user@vm code]$ python simulate_prs_py2.py --tree ../data/tree/tree.hdf5 --true_prs ../data/prs_true/prs.prs_true --ncausal=200 --h2=0.33 --out ../data/case_control/sim_full
Number of haplotypes: 400000,400000,400000
Number of trees: 2946715
Number of mutations: 3454912
Sequence length: 62949445.0
True PRS read from file: ../data/prs_true/prs.prs_true. 600000 lines imported.
Defining cases/controls [2020-07-27 23:24:48]

运行B:现在我正在运行相同的脚本并将输出重定向到文件“output.txt”。现在,它将前几行打印到我的屏幕上,并将最后两行打印到文件中。为什么不把所有内容都存入文件呢?此外,现在的顺序是混乱的:文件的第一行(True PRS...)应该位于屏幕输出的最后一行(定义案例...)之前。

(genPy2) [user@vm code]$ python simulate_prs_py2.py --tree ../data/tree/tree.hdf5 --true_prs ../data/prs_true/prs.prs_true --ncausal=200 --h2=0.33 --out ../data/case_control/sim_full > output.txt
Number of haplotypes: 400000,400000,400000
Number of trees: 2946715
Number of mutations: 3454912
Sequence length: 62949445.0
Defining cases/controls [2020-07-27 23:25:22]
(genPy2) [user@vm code]$ cat output.txt 
True PRS read from file: ../data/prs_true/prs.prs_true. 600000 lines imported.
Case control variables saved to ../data/case_control/c_c.case_control.pickle.
End

运行C:我现在使用 nohup 并将输出保存到文件“../data/case_control/output.txt”。现在,所有输出都重定向到输出文件,但“True PRS...”和“Defining Cases...”这两个语句的顺序仍然相反。

(genPy2) [user@vm code]$ nohup python simulate_prs_py2.py --tree ../data/tree/tree.hdf5 --true_prs ../data/prs_true/prs.prs_true --ncausal=200 --h2=0.33 --out ../data/case_control/sim_full > ../data/case_control/output.txt
nohup: ignoring input and redirecting stderr to stdout

(genPy2) [user@vm code]$ cat ../data/case_control/output.txt 
Number of haplotypes: 400000,400000,400000
Number of trees: 2946715
Number of mutations: 3454912
Sequence length: 62949445.0
Defining cases/controls [2020-07-27 23:26:09]
True PRS read from file: ../data/prs_true/prs.prs_true. 600000 lines imported.
Case control variables saved to ../data/case_control/c_c.case_control.pickle.
End

我 80% 确定这是 shell 中的问题,而不是我的 python 脚本中的问题。一切都很好,如果是这样的话。然而,Python 脚本正确运行至关重要。

非常感谢任何关于为什么会发生这种情况以及如何解决它的建议。

答案1

我在不知道任何细节的情况下回收了一个 python 脚本:

该脚本在 Python 2 中运行,并print从包中导入一个函数__future___作为eprint.这被打印到,stderr而用print(Python 2 默认值)打印的所有内容都被打印到stdout.这造成了

  • print运行 A 中缺少的语句以及屏幕eprint上显示的语句
  • 保存语句时,要在运行 B 中将语句print保存到“output.txt”eprint
  • nohub 将两者stderr都定向stdout到文件中。因此,在运行 C 中,所有内容都定向到输出文件。但是,我仍然无法解释相反的顺序。

仅使用eprint就解决了我所有的问题。

感谢@Panki 指导我来到这里

相关内容