2017-08-03 15 views
2

マスタースクリプトからpythonスクリプトを呼び出そうとしています。私は、マスターフレーム内から1つだけ生成されるデータフレームを必要とし、サブプロセス内で使用される引数としてサブプロセススクリプトに渡されます。pandasデータフレームを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モジュールを使用しようとしている私の最初の時間です。どんな助けでも大歓迎です。

答えて

2

サブプロセスが別のアプリケーションを起動します。プロセスが互いに通信する方法は、Pythonプログラム内で通信する関数と大きく異なります。 DataFrameは非python環境で渡す必要があります。だからあなたはそれをテキストに直列化し、それを逆順に逆シリアル化する必要があります。たとえば、pickleモジュールを使用して、片端にsp.communicate(pickle.dumps(test_dataframe))、他端にpickle.loads(sys.stdin.read())を使用することができます。または、DataFrameをcsvとして書き込んだ後、再度解析することもできます。または、他の形式を使用することもできます。

+0

こんにちはアレックス、返信ありがとうございます。私はpickleを使用しようとしましたが、マスタースクリプトを実行した後、エラーを出さずに終了し、サブプロセススクリプトからのコマンドはまったく実行されません。 –

+0

本当に、そのサブプロセスは実行されていませんか?実行されるかもしれませんが、正常に終了したかどうかを確認しませんか?プロセスからの出力もチェックし、 '' 'sp.comminucate'''によって返されます。それ以外に '' 'shell = True''が何をしているかを確認してください。コマンドを配列として渡すだけでなく、 '' 'shell = True'''を指定します。 –

+0

私のサブプロセスはprintコマンドで始まり、それが実行されているかどうかを見るためにraw_input()で終わります。ポップアップウィンドウはそれ自身で閉じる前に何も表示しません。私はシェルを使わずに試しましたが、どちらの方法でもサブプロセスから何も得られません。 stdin、stdout、stderrを使わずに実行しようとしましたが、サブプロセスからの最初のprintコマンドは実行されますが、pickle.loads(sys.stdin.read())では永遠にハングします。 –

関連する問題