运行 子进程的最 pythonic 方法是什么将输出保存在变量中并将其加载到 pandas 数据框中

What is the most pythonic way to run subprocess save the output in a variable and load it into a pandas data frame

我很难做到这一点

# Save the bash process in a python variable
cmd='bedtools intersect -wao -b/path/file_a -a /path/file_b'
p=Popen(cmd,shell=True,stdin=PIPE,stdout=PIPE,stderr=STDOUT,close_fds=True)
output=p.stdout.read()

# Import this string that is a tsv
df=StringIO(output)
cnvs=pd.read_csv(df,
                            sep='\t',
                            index_col=False,
                            names=['#CHROM',
                                   'START',
                                   'END',
                                   'CNV_TYPE'
                                    'CNV ID',
                                   'Chromosome_g'.
                                   'Transcript_start_g',
                                   'Transcript_end_g',
                                   'Transcript_stable_ID_g',
                                   'canonical_g',
                                   'Gene stable_ID_g',
                                   'Gene_name_g',
                                   'amount_overlap_g'])

我一直在尝试从不同教程中找到的不同方法。现在我收到错误

TypeError:initial_value must be a str or None, not bites

不仅仅是修复错误我想知道这是否是这样做的方法。

最初我将 bash 命令的输出保存在一个文件中,然后将文件加载到 pandas。我不仅认为这不是最可悲的方式,而且我在 HPC 中工作,创建文件非常慢。

就我个人而言,我认为这不是特别不符合 pythonic。如果我有一个将 tsv 打印到 stdout 的命令,这或多或少是我会做的。要修复错误,请注意 stdout 是一个字节对象。因此,使用 BytesIO 而不是 StringIO。 (此外,我会使用 with Popen(...) as p: 更像 Pythonic)