2017-08-03 90 views
2

我正在嘗試從主腳本調用python腳本。我需要從主腳本中僅生成一個數據框,然後將其傳遞給子流程腳本作爲在子流程內部使用的參數。將熊貓數據框傳遞給python子進程.Popen作爲參數

以下是我在編寫所需的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

子進程啓動另一個應用程序。進程之間可以進行通信的方式與python程序中函數進行通信的方式顯着不同。您需要通過非pythonic環境傳遞您的DataFrame。所以你需要將它序列化爲一個文本,然後在另一端反序列化它。例如,您可以使用泡菜模塊,然後在另一端的pickle.loads(sys.stdin.read())上使用sp.communicate(pickle.dumps(test_dataframe))。或者你可以把你的DataFrame寫成csv,然後再解析它。或者你可以使用任何其他格式。

+0

嗨亞歷克斯,謝謝你的答覆。我嘗試使用pickle,但是在通過主腳本之後,它會自行關閉而不會發出任何錯誤,並且根本沒有來自subprocess腳本的命令。 –

+0

你確定,該子程序沒有執行?可能會被執行,但你不檢查它是否成功完成?同時檢查進程的輸出,它由'''sp.comminucate'''返回。除此之外,請檢查一下'''shell = True''的功能。您將命令作爲數組傳遞,但也指定'''shell = True'''。 –

+0

我的子過程以打印命令開始,並以raw_input()結束,以便我看它是否運行,彈出窗口在自己關閉之前不顯示任何內容。我嘗試過使用和不使用shell,我沒有從子進程獲取任何東西。我試圖運行沒有標準輸入,標準輸出和標準錯誤,只有然後從子進程的第一個打印命令運行,但永遠掛在pickle.loads(sys.stdin.read())。 –

相關問題