Python

重定向中斷輸出(Python 腳本)

  • July 28, 2020

我多次執行相同的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:**我正在使用預設輸出執行腳本:我的螢幕。print 語句的順序是正確的,但是最後兩個 print 語句失去了:

(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 腳本正確執行至關重要。

非常感謝任何建議為什麼會發生這種情況以及如何解決它。

我在不知道一個細節的情況下回收了一個 python 腳本:

該腳本在 Python 2 中執行,並將包中的print函式導入為. 這被列印到,而所有使用(Python 2 預設)列印的東西都被列印到. 這導致__future___``eprint``stderr``print``stdout

  • print執行 A 中缺少的語句以及eprint要在螢幕上顯示的語句
  • 在保存語句時將語句print保存到執行 B 中的“output.txt”eprint
  • nohub 既指向文件stderr,也指向stdout文件。所以在執行 C 中,所有內容都被定向到輸出文件。但是,我仍然無法解釋相反的順序。

只有使用eprint解決了我所有的問題。

感謝@Panki 指導我到這裡

引用自:https://unix.stackexchange.com/questions/600698