在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
。如果您被要求您提供缺失信息的评论所冒犯,请阅读帮助,并将这些信息放在第一位。至于否决票……老实说,在您解决了问题中最严重的问题后,您通常无法收回它们(因为原始投票人通常不会回来),但是如果您将问题编辑成一个好的问题,你通常会得到足够多的选票来弥补它。但你真的不应该如此关注选票;当然,对于你来说,是否得到一个对你有帮助的答案比没有意义的互联网点更重要?