Exécuter un exe python à partir d'Exécuter le programme()J'ai un exécutable python (donc moi ou d'autres n'avons pas besoin de python installé sur le PC) qui peut analyser certaines données...
Je voudrais appeler et exécuter ceci depuis JMP, mais je ne suis pas sûr de la meilleure façon car j'aimerais pouvoir alimenter des variables vers cet exe python depuis JMP ainsi qu'obtenir le retour.
Je l'ai fait avec succès en utilisant les commandes python intégrées, mais jamais avec un fichier exe python. L'une des variables que j'aurais besoin d'alimenter est un tableau de données. Actuellement, j'aurais besoin que JMP enregistre la table au format .csv dans un emplacement temporaire, puis cet exe python peut exécuter et modifier ce .csv... puis JMP peut ouvrir le CSV mis à jour (je n'ai pas ce flux codé en JSL car je pense qu'il doit y avoir une meilleure façon)
Des pensées? J'ai une expérience minimale avec Run Command() donc tous les pointeurs de départ seront appréciés 
Merci!
Modélisation statistique avancéeAutomatisation et scriptsÉtudes de consommation et de marchéAccès aux donnéesPersonnalisation de masseRe : Exécuter un exe python à partir d'Exécuter le programme()Il existe un exemple fonctionnel dans Créer une vidéo dans JMP avec FFmpeg . Il utilise l'exécutable FFmpeg, pas un exécutable python, mais il affiche à la fois la lecture depuis stdout et l'écriture sur stdin. La fonction de lecture fait simplement écho au journal JMP, mais vous pouvez mettre le texte en mémoire tampon et faire autre chose si vous le souhaitez. La fonction d'écriture diffuse les images vers FFmpeg pour les encoder, une à la fois.
Avec FFmpeg, il est utile d'avoir un écho en temps réel dans le journal JMP lorsque les images sont transmises à FFmpeg ; cela me permet de voir si quelque chose ne va pas au milieu d'un long processus. Si vous avez un processus plus court, avec une seule sortie (éventuellement volumineuse) à la fin, vous trouverez plus pratique d'utiliser readfunction("text" or "blob") qui permet à JMP de tamponner la sortie standard en une seule chaîne qui est revenu. Il ne nécessite pas non plus d'attendre (voir la fin de l'exemple) la fin du RunProgram pour obtenir les résultats. D'un autre côté, l'utilisation de readfunction(function(...)) permet à JMP de commencer à traiter la sortie pendant sa génération.
Si le programme Python génère un CSV sur la sortie standard, readfunction doit utiliser un blob pour deux raisons (même si les données doivent être en ASCII 7 bits) : un blob peut être plus grand que 2 Go mais une chaîne JSL ne le peut pas, et vous pouvez charger la goutte comme dt = ouvert (blobVariable, "csv") . Mettez un en-tête sur le CSV et c'est utile même si vous n'avez besoin de renvoyer que quelques valeurs nommées sous forme de tableau avec une seule ligne.
Il y a quelques exemples de code Python enfouis dans Beowulf, Newton et M. Hanson qui lit les paramètres de ligne de commande - recherchez optez pour --, mais vous pouvez probablement trouver des exemples plus faciles à utiliser ailleurs. Dans cet exemple, JMP utilise plink (de putty) pour exécuter Python sur une machine distante et utilise un disque NFS sur le réseau pour partager des données.
Re : Exécuter un exe python à partir d'Exécuter le programme()Ouais, je dirais que ça vaut la peine d'être testé. J'ai exécuté une fonction d'écriture/lecture de flux similaire sous Unix pour passer d'une très grande trame de données Pandas à une table Postgres et c'est extrêmement rapide. Je ne sais pas à quoi ressemble l'implémentation de JMP, mais peut-être pouvez-vous écrire la table entière dans le stdin en une seule fois ? Comme une gigantesque liste de listes peut-être...
Pour référence, j'ai testé la méthode Python sur une trame de données Pandas d'une taille d'environ 3 Go et cela a pris moins de 10 secondes. La méthode est la suivante :
def psql_insert_copy(table, conn, keys, data_iter):
"""
Parameters
----------
table : pandas.io.sql.SQLTable
conn : sqlalchemy.engine.Engine or sqlalchemy.engine.Connection
keys : list of str
Column names
data_iter : Iterable that iterates the values to be inserted
"""
# gets a DBAPI connection that can provide a cursor
dbapi_conn = conn.connection
with dbapi_conn.cursor() as cur:
s_buf = StringIO()
writer = csv.writer(s_buf)
writer.writerows(data_iter)
s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys)
if table.schema:
table_name = '{}.{}'.format(table.schema, table.name)
else:
table_name = table.name
sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(
table_name, columns)
cur.copy_expert(sql=sql, file=s_buf)
df.to_sql('example', schema='demo', con=DL.engine, method=psql_insert_copy)Que j'ai trouvé sur un site quelque part il y a longtemps (je ne suis pas si intelligent
). Il utilise un itérateur de données et l'écrit ligne par ligne dans le stdin du curseur postgres, mais cela reste extrêmement rapide.
Re : Exécuter un exe python à partir d'Exécuter le programme()L'avantage de CSV ou Pandas est que vous n'avez pas besoin d'analyser la sortie python. Si votre sortie ressemble à un fichier CSV, vous pouvez la recevoir sous forme de readprogram(blob) et ouvrir le blob avec l'option csv pour obtenir une table.Re : Exécuter un exe python à partir d'Exécuter le programme()@Michael_MXAK Hmm, c'est aussi une idée intéressante. Pour les fichiers plus petits, cela peut fonctionner correctement. Certains de ces fichiers peuvent devenir assez volumineux, de sorte que la méthode ligne par ligne peut ne pas être trop efficace... Mais c’est une excellente matière à réflexion.
Re : Exécuter un exe python à partir d'Exécuter le programme()@Craige_Hales Ok, cela a du sens... c'est là que je penchais, mais afficher les informations dans la chaîne pour les récupérer serait plus facile qu'un deuxième csv à gérer.
Re : Exécuter un exe python à partir d'Exécuter le programme()Je ne l'ai pas fait et je ne peux pas le tester facilement sur mon système pour le moment, mais il semble que vous puissiez lire à partir de la sortie standard d'un exécutable et écrire dans les flux stdin d'un exécutable en utilisant JSL : https://community.jmp.com/kvoqx44227/attachments/kvoqx44227/discovery-2016-content/67/1/Run%20Program.pdf
Python peut lire depuis stdin (et sortir vers stdout) comme une opération de type fichier : Python - stdin, stdout et stderr - AskPython
Je suis donc raisonnablement sûr que vous pourriez « écrire votre table de données ligne par ligne dans le stdin de l'exécutable de JMP, utiliser une méthode de type fichier pour lire les lignes de JMP en Python, construire ces lignes dans un Dataframe Pandas, exécutez vos opérations Python, puis affichez la trame de données Pandas ligne par ligne de Python vers la sortie standard, en la renvoyant à JMP.
Re : Exécuter un exe python à partir d'Exécuter le programme()Utiliser un exécutable construit à partir d'un programme Python via RunProgram ou appeler l'interpréteur Python avec le script Python depuis RunProgram est similaire. Ni l’un ni l’autre n’a l’intégration qu’offre l’utilisation de Python intégré. Vous devrez utiliser quelque chose comme un fichier CSV pour envoyer des données au programme Python et récupérer les données du programme Python. Vous pouvez également transmettre des paramètres de ligne de commande au fichier .exe. (Ou à l'interpréteur python.)
Dans votre cas, je suggérerais d'écrire le CSV dans le répertoire $temp et d'imprimer les résultats en python. Passez le chemin csv via la ligne de commande. Utilisez RunProgram(...readfunction("text")...) pour récupérer la chaîne de sortie imprimée. supprimez le fichier du répertoire temporaire.