将pandas dataframe传递给python subprocess.Popen作为参数

时间:2017-08-03 17:08:30

标签: python pandas dataframe subprocess

我试图从主脚本调用python脚本。我需要在主脚本中只生成一个数据帧,然后将其作为参数传递给子进程脚本。

以下是我尝试编写所需的python主脚本。

from subprocess import PIPE, Popen
import pandas as pd

test_dataframe = pd.read_excel(r'C:\test_location\file.xlsx',sheetname='Table')

sp = Popen(["python.exe",'C:/capture/test.py'], shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
sp.communicate(test_dataframe)

这是错误: TypeError: argument 1 must be convertible to a buffer, not DataFrame

这是我第一次尝试使用子进程模块,所以我还不是很擅长。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

Subprocess启动另一个应用程序。进程之间可以相互通信的方式与python程序中的函数通信方式有很大不同。您需要通过非pythonic环境传递DataFrame。因此,您需要将其序列化为文本,然后在另一端反序列化。例如,您可以使用pickle模块,然后在另一端sp.communicate(pickle.dumps(test_dataframe))上使用pickle.loads(sys.stdin.read())。或者您可以将您的DataFrame编写为csv,然后再次解析它。或者您可以使用任何其他格式。

答案 1 :(得分:2)

这是Python 3.6中在主脚本和子进程之间进行双向通讯的完整示例。

master.py

import pandas as pd
import pickle
import subprocess

df = pd.read_excel(r'C:\test_location\file.xlsx',sheetname='Table')

result = subprocess.run(['python', 'call_model.py'], input=pickle.dumps(df), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
returned_df = pickle.loads(result.stdout)
assert df == returned_df

如果有问题,可以检查result.stderr

subroutine.py

import pickle
import sys

data = pickle.loads(sys.stdin.buffer.read())
sys.stdout.buffer.write(pickle.dumps(data))