gpt4 book ai didi

python - 将 header 添加到 python 子进程的 stdout

转载 作者:行者123 更新时间:2023-11-30 22:13:56 25 4
gpt4 key购买 nike

我正在将多个数据帧合并为一个,并使用 unix sort 对它们进行排序。在写入最终排序数据之前,我想向该输出添加前缀/ header 。

所以,我的代码是这样的:

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)  

但这给了我一个错误,正如我所料。


如何将该 header 添加到子进程输出的开头。我相信这可以通过简单的代码更改来实现。

最佳答案

您的代码的问题是缓冲问题; 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() 操作系统文件描述符,这些写入可能会提前那些转到sort_data的。

这正是当您在子进程中使用该文件作为管道时所发生的情况。这似乎没有直接解释,但可以从 Frequently Used Arguments 推断出来:

stdin, stdout and stderr specify the executed program’s standard input, standard output and standard error file handles, respectively. Valid values are PIPE, DEVNULL, an existing file descriptor (a positive integer), an existing file object, and None.

这非常强烈地暗示——如果您足够了解管道在 *nix 和 Windows 上的工作方式——它将实际的文件描述符/句柄传递给底层操作系统功能。但实际上并没有这么说。要真正确定,您必须检查 the Unix sourceWindows source ,您可以在其中看到它正在对文件对象调用 filenomsvcrt.get_osfhandle

关于python - 将 header 添加到 python 子进程的 stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com