簡體   English   中英

將標頭添加到python中的子進程的stdout

[英]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的管道時發生的情況。 這似乎沒有直接解釋,但可以從“ 常用參數”推論得出:

stdinstdoutstderr分別指定執行程序的標准輸入,標准輸出和標准錯誤文件句柄。 有效值為PIPEDEVNULL ,現有文件描述符(正整數),現有文件對象和None

如果您對管道在* nix和Windows上的工作方式了解得足夠多,這將非常有力地暗示它會將實際的文件描述符/句柄傳遞給底層OS功能。 但是實際上並沒有那么說。 確實可以確定,您必須檢查Unix源Windows源 ,您可以在其中看到它在文件對象上調用filenomsvcrt.get_osfhandle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM