[英]add header to stdout of a subprocess in python
我將幾個數據幀合並為一個,並使用unix sort
對其進行unix sort
。 在寫入最終排序的數據之前,我想在該輸出中添加一個前綴/標頭。
所以,我的代碼是這樣的:
my_cols = '\t'.join(['CHROM', 'POS', "REF" ....])
my_cmd = ["sort", "-k1,2", "-V", "final_merged.txt"]
with open(output + 'mergedAndSorted.txt', 'w') as sort_data:
sort_data.write(my_cols + '\n')
subprocess.run(my_cmd, stdout=sort_data)
但是,上面的doe將my_cols
放在最終輸出文件的末尾(即mergedAndSorted.txt )
我也嘗試替換:
sort_data=io.StringIO(my_cols)
但這給了我一個我所期望的錯誤。
如何將該標頭添加到子流程輸出的開頭。 我相信可以通過簡單的代碼更改來實現。
您的代碼的問題是緩沖問題。 tldr是您可以像這樣修復它:
sort_data.write(my_cols + '\n')
sort_data.flush()
subprocess.run(my_cmd, stdout=sort_data)
如果您想了解其原因以及修復程序的解決方案,請執行以下操作:
當您以文本模式打開文件時,就是在打開一個緩沖文件。 寫入會進入緩沖區,並且文件對象不一定會立即將其刷新到磁盤。 (從Unicode到字節的流編碼也一直在進行,但這並沒有真正增加新的問題,它只是添加了兩層可以發生相同的事情,因此我們忽略它。)
只要您對緩沖文件對象的所有寫操作都沒問題-它們會在緩沖區中正確排序,因此它們會在磁盤上正確排序。
但是,如果您寫入基礎sort_data.buffer.raw
磁盤文件或sort_data.fileno()
OS文件描述符,則這些寫入可能會領先於sort_data
。
這就是將文件用作subprocess
的管道時發生的情況。 這似乎沒有直接解釋,但可以從“ 常用參數”推論得出:
stdin , stdout和stderr分別指定執行程序的標准輸入,標准輸出和標准錯誤文件句柄。 有效值為
PIPE
,DEVNULL
,現有文件描述符(正整數),現有文件對象和None
。
如果您對管道在* nix和Windows上的工作方式了解得足夠多,這將非常有力地暗示它會將實際的文件描述符/句柄傳遞給底層OS功能。 但是實際上並沒有那么說。 確實可以確定,您必須檢查Unix源和Windows源 ,您可以在其中看到它在文件對象上調用fileno
或msvcrt.get_osfhandle
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.