2017-08-03 1 views
2

Je tente d'appeler un script python à partir d'un script maître. J'ai besoin que la structure de données soit générée seulement à partir du script principal, puis transmise au script de sous-processus en tant qu'argument à utiliser dans le sous-processus. Voici ma tentative d'écriture du script maître python requis.Transférer des données pandas dans un sous-processus python. Ouvrir comme argument

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) 

Et voici l'erreur: TypeError: argument 1 must be convertible to a buffer, not DataFrame

Ceci est ma première fois d'essayer d'utiliser le module subprocess donc je ne suis pas très bon dans ce domaine encore. Toute aide sera très appréciée.

Répondre

2

Le sous-processus lance une autre application. Les façons dont les processus peuvent communiquer entre eux diffèrent considérablement des façons dont les fonctions communiquent dans le programme python. Vous devez passer votre DataFrame dans un environnement non pythonique. Vous devez donc le sérialiser dans un texte, puis le désérialiser à l'autre extrémité. Par exemple, vous pouvez utiliser le module Pickle puis sp.communicate(pickle.dumps(test_dataframe)) sur une extrémité pickle.loads(sys.stdin.read()) sur un autre. Ou vous pouvez écrire votre DataFrame en tant que csv, puis l'analyser à nouveau. Ou vous pouvez utiliser n'importe quel autre format.

+0

Salut Alex, merci pour la réponse. J'ai essayé d'utiliser pickle, mais après avoir traversé le script maître, il se ferme sans donner aucune erreur et aucune commande du script de sous-processus est exécutée du tout. –

+0

Etes-vous sûr que cette sous-fonction n'est pas exécutée? Peut-être est-il exécuté, mais vous ne vérifiez pas s'il a terminé avec succès? Vérifiez également la sortie du processus, elle est renvoyée par '' 'sp.comminucate'''. À côté de cela, vérifiez ce que fait '' 'shell = True'''. Vous passez commande en tant que tableau, mais spécifiez aussi '' 'shell = True'''. –

+0

Mon sous-processus commence par une commande d'impression et se termine par raw_input() pour que je puisse voir s'il fonctionne ou pas, la fenêtre pop-up ne montre rien avant de se fermer tout seul. J'ai essayé avec et sans utiliser le shell, je ne reçois rien du sous-processus de toute façon. J'ai essayé d'exécuter sans stdin, stdout et stderr, seulement alors la première commande d'impression de sous-processus s'exécute mais se bloque à pickle.loads (sys.stdin.read()) pour toujours. –