将 Pandas 数据框导出到子进程作为标准输入

Export Pandas Dataframe to subprocess as stdin

我正在使用 python 查询 impala 数据库,return SQL 查询的结果作为数据框。我想将该数据帧作为 stdin 传递给对另一个程序的子进程调用,但不知道如何进行。

# create dataframe from query results
query_df = cur.execute(sql_query)

# create subprocess command
subprocess_cmd = r'''{} | java -Xmx16g -jar snpeff.jar -t GRCh37.75 > out_file}'''.format(query_df)

# run the subprocess command
ps = sp.Popen(subprocess_cmd, shell=True, stdout=sp.PIPE, stderr=sp.PIPE, cwd=os.getcwd())
try:
    print ps.communicate()
except sp.CalledProcessError as e:
    print e

我可以将 pandas 数据帧打印到标准输出,如下所示:

query_df.to_csv(sys.stdout, sep='\t')

但我不知道如何将它输入子流程,或者我是否在正确的轨道上。在此先感谢您的帮助!

可能您必须在 csv 文件中显式写入 query_df 内容,然后告诉子进程它可以从哪里获取数据。

# write to a file
query_df.to_csv('test.csv', sep='\t')

# create subprocess command
subprocess_cmd = r'''cat test.csv | java -Xmx16g -jar snpeff.jar -t GRCh37.75 > out_file}'''.format(query_df)

或者您确定要使用标准输出?

好的,我用 stdin 找到了决定:)

# create subprocess command
subprocess_cmd = r'''java -Xmx16g -jar snpeff.jar -t GRCh37.75 > out_file}'''.format(query_df)

# run the subprocess command
ps = sp.Popen(subprocess_cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=os.getcwd())
try:
  print ps.communicate(query_df.to_csv(sep='\t'))
except sp.CalledProcessError as e:
  print e

请尝试一下。