簡體   English   中英

將pandas dataframe傳遞給python subprocess.Popen作為參數

[英]passing pandas dataframe into a python subprocess.Popen as an argument

我試圖從主腳本調用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

這是我第一次嘗試使用子進程模塊,所以我還不是很擅長。 任何幫助都感激不盡。

Subprocess啟動另一個應用程序。 進程之間可以相互通信的方式與python程序中的函數通信方式有很大不同。 您需要通過非pythonic環境傳遞DataFrame。 因此,您需要將其序列化為文本,然后在另一端反序列化。 例如,您可以使用pickle模塊,然后在另一端的pickle.loads(sys.stdin.read())上使用sp.communicate(pickle.dumps(test_dataframe)) 或者您可以將您的DataFrame編寫為csv,然后再次解析它。 或者您可以使用任何其他格式。

下面是主要腳本和子進程之間雙向通信的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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM