在python中将头添加到子进程的标准输出

在python中将头添加到子进程的标准输出,python,subprocess,stdout,prepend,Python,Subprocess,Stdout,Prepend,我正在将多个数据帧合并为一个,并使用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_

我正在将多个数据帧合并为一个,并使用
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
放在最终输出文件的末尾(即mergedandsorded.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\u data.buffer.raw
磁盘文件,或者写入
sort\u data.fileno()
OS文件描述符,则这些写入可能会超前于进入
sort\u data
的写入

这正是在
子流程
中将文件用作管道时发生的情况。这似乎没有直接解释,但可以从以下方面推断:

stdin、stdout和stderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值包括
PIPE
DEVNULL
、现有文件描述符(正整数)、现有文件对象和
None


如果您对管道在*nix和Windows上的工作方式了解得足够多,那么这就意味着它正在将实际的文件描述符/句柄传递给底层操作系统功能。但实际上并没有这么说。要真正确定,您必须检查和,您可以看到它正在调用
fileno
msvcrt。获取文件对象上的\u osfhandle

它有什么错?如果不告诉我们这些,我们只能猜测导致它出错的代码出了什么问题。@abarnert:您可以看到其中一个
sort\u data=io.StringIO.
根本不起作用。另一个
sort\u data.write(my\u cols+'\n')
将字符串放在输出文件的末尾,尽管它应该放在开头。我不确定为什么投票结束了这个简单明了的问题。另外,我在谷歌上搜索了一个多小时,在网上找到了一个解决方案,并尝试了几次代码修改来修复它。为什么人们在没有充分阅读的情况下就结束/否决了这个问题。另外,这个问题应该是如此全面和详细。真的吗?我怎么能看出它不起作用?我无法运行它,因为
,并且不知道
mergedandsordered.txt
中有什么内容,而且,即使我可以,它实际上也不会产生任何输出,所以我如何才能看到它在做什么有什么问题?您的编辑确实解释了它的错误,而不是让我们猜测,这是一个巨大的改进,但它甚至比a更远,因为它在
输出上添加了
namererror
。如果您被要求您提供缺失信息的评论所冒犯,请阅读帮助,并将这些信息放在第一位。至于否决票……老实说,在您解决了问题中最严重的问题后,您通常无法收回它们(因为原始投票人通常不会回来),但是如果您将问题编辑成一个好的问题,你通常会得到足够多的选票来弥补它。但你真的不应该如此关注选票;当然,对于你来说,是否得到一个对你有帮助的答案比没有意义的互联网点更重要?