python子进程popen:Piping stdout弄乱了字符串

2024-03-29 10:17:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将几个文件连接在一起并添加一个标头。在

import subprocess
outpath = "output.tab"
with open( outpath, "w" ) as outf :
        "write a header"
        if header is True:
            p1 = subprocess.Popen(["head", "-n1", files[-1] ], stdout= outf, )
        if type(header) is str:
            p1 = subprocess.Popen(["head", "-n1", header ], stdout= outf,)
        for fl in files:
            print(  fl )
            p1 = subprocess.Popen(["tail", "-n+2", fl], stdout= outf, )

由于某些原因,某些文件(fl)仅部分打印,下一个文件在前一个文件的字符串中开始:

^{pr2}$

有没有办法在Python中修复它?在


混乱的线路示例:

$tail -n+108 output.tab | head -n1

CENPA   chr2    27008881.0  2701ABCD3   chr1    94883932.0  94944260.0  0.0316227766017 0.260698861451  0.277741584016  0.302602378581  0.4352790705329718  56  16


$grep -n A1 'CENPA' file1.tab

109:CENPA   chr2    27008881.0  27017455.0  1.0 0.417081004817  0.0829327365256 0.545205239241  0.7196619496326693  95  3
110-CENPO   chr2    25016174.0  25045245.0  1000.0  0.151090930896  -0.0083671250883    0.50882773122   0.0876177652747541  82  0


$grep -n 'ABCD3' file2.tab
2:ABCD3 chr1    94883932.0  94944260.0  0.0316227766017 0.260698861451  0.277741584016  0.302602378581  0.4352790705329718  56  16

Tags: 文件outputstdouttabheadheadersubprocesspopen
1条回答
网友
1楼 · 发布于 2024-03-29 10:17:58

我认为这里的问题是subprocess.Popen()在默认情况下是异步运行的,而且您似乎希望它同步运行。所以实际上,所有的headtail命令同时运行,指向输出文件。在

要解决这个问题,您可能只需要添加.wait()

import subprocess
outpath = "output.tab"
with open( outpath, "w" ) as outf :
    "write a header"
    if header is True:
        p1 = subprocess.Popen(["head", "-n1", files[-1] ], stdout= outf, )
        p1.wait()  # Pauses the script until the command finishes
    if type(header) is str:
        p1 = subprocess.Popen(["head", "-n1", header ], stdout= outf,)
        p1.wait()
    for fl in files:
        print(  fl )
        p1 = subprocess.Popen(["tail", "-n+2", fl], stdout= outf, )
        p1.wait()

相关问题 更多 >