Meilleure méthode pour obtenir un objet python dans JMP<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai du code Python qui peut générer environ 3 Go de données en 15 minutes.Il diffuse actuellement les données dans un fichier texte sous la forme d'une ligne "colonne" value1|value2|value3.., puis effectue un post-traitement pour convertir l'intégralité du fichier texte en un fichier CSV que jmp peut ouvrir.Le fichier csv peut contenir jusqu'à environ 30 000 colonnes et 100 à 10 000 lignes après avoir divisé les valeurs.
Pour que les données parviennent plus rapidement à JMP, je souhaite diffuser les données texte directement de la mémoire de la session python vers une session jmp.
J'ai essayé une ancienne automatisation en utilisant pycom mais il semble que les appels à pycom soient très lents, ce qui rend difficile l'itération sur chaque ligne et la mise à jour de la ligne correcte pour les quelques valeurs produites dans cette "ligne".
Y a-t-il un autre moyen ? table mémoire sqlite ? Prise JSL ?API Python JMP ?
Re : Meilleure méthode pour importer un objet Python dans JMPCraig,
Pas beaucoup d'aide, mais cela fonctionne également de cette façon dans JMP 13. Je dois demander au support JMP... Peut-être que cela sera corrigé dans JMP 14.
Re : Meilleure méthode pour importer un objet Python dans JMPMerci de l'avoir regardé et bonne question.
Je pense que vous combattez le comportement de la ligne de commande Windows avec des espaces intégrés dans les noms de fichiers.Dans une boîte DOS, vous utiliseriez des guillemets comme ceci :

l'échappement devient un peu moche, mais le voici en JSL :
runprogram(executable("cmd.exe"), options({"/C","dir \!"c:\Users\chales\Saved Games\!""}), readfunction("text"))Je n'ai pas de python ici au bureau, mais je prévois qu'il aura le même comportement.La situation est encore pire si vous devez intégrer des guillemets ; un autre projet sur lequel je travaille a utilisé \" comme décrit dans l'une des réponses de http://stackoverflow.com/questions/7760545/cmd-escape-double-quotes-in-parameter
Si vous devez choisir les noms de chemin pour vos projets, laisser les espaces vides facilitera la tâche.Si vous disposez d'un sélecteur de fichiers, vous devez l'autoriser.
Re : Meilleure méthode pour importer un objet Python dans JMPUne façon très intéressante d'utiliser Run Program
Je n'ai pas la solution mais cela fonctionne dans JMP 12.1 sur Mac
f = Pick File();
x = RunProgram(
executable("/usr/bin/python"),
options(f),
readfunction("blob")
);
Re : Meilleure méthode pour importer un objet Python dans JMPCraige@JMP
J'avais un problème avec Run Program qui semblait lié aux options et au nom de fichier que j'utilise pour Run Program.Si j'utilise pick file(), cela plante pour moi.Ou si je code en dur un répertoire contenant un espace.
Avez-vous des suggestions pour rendre cette dynamique ?Utilisation de JMP 12.0.1.
Exemple
f = pick file();
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options(f),
readfunction("blob")
);
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options("/C:/Users/User/Desktop/generate.py"),
readfunction("blob")
);
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options("'C:/Google Drive/Work/Scripting/generate.py'"),
readfunction("blob")
);
//works
x = runprogram(executable("C:\Python34\python.exe"),
options("C:/Users/User/Desktop/generate.py"),
readfunction("blob")
);
Re : Meilleure méthode pour importer un objet python dans JMPVoici un exemple complet qui s'exécute en 2 secondes environ pour 1 000 000 de doubles :
le code python construit un tableau de doubles, crée une chaîne binaire d'octets et écrit les octets sur la sortie standard.Vous pouvez utiliser un fichier si vous le souhaitez, assurez-vous simplement qu'il est ouvert en mode binaire (wb).Le ">" au début du format du pack signifie "big endian".
"générer.py"
import arrayimport structimport mathimport sys# windows python messes up binary newlines...unless...if sys.platform == "win32": import os, msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)bigmat = array.array("d")for x in range(0,1000000): bigmat.append(math.sqrt(x))# %s is replaced by "1000000" ... d is for double precision 8 bytes eachbinary = struct.pack(">%sd" % len(bigmat), *bigmat)# print len(binary) # 8000000 bytessys.stdout.write(binary) le JSL utilise runProgram pour exécuter le programme python et lit un blob à partir de la sortie standard.BlobToMatrix spécifie « big » pour correspondre aux données big endian.Vous pouvez utiliser LoadTextFile( ...BLOB ) au lieu de runProgram si vous exécutez le programme python séparément et écrivez un fichier.Vous auriez toujours besoin de blobToMatrix.
"fetch.jsl"
x = runprogram(executable("C:\Python27\python.exe"), options("C:\Users\User\Desktop\pythonExample\generate.py"), readfunction("blob"));xx = blobToMatrix(x,"float",8,"big");// verify...ok="good";for(i=0,i if( xx[i+1] != sqrt(i), ok="bad"));show(ok); ok = "bien" ;
http://stackoverflow.com/questions/2374427/python-2-x-write-binary-output-to-stdout avait la réponse au problème de nouvelle ligne binaire.
Re : Meilleure méthode pour importer un objet python dans JMPJe pense que vous pouvez déplacer des données à virgule flottante IEEE ou des entiers entre Python et JMP en utilisant 7.1. struct — Interpréter les octets comme des données binaires compressées — Documentation Python 3.5.0 du côté python et blobToMatrix du côté JMP.Aucune conversion entre binaire et caractère et retour au binaire ne l'accélérera beaucoup. Utilisez un fichier ou un socket entre eux.Sont-ils sur la même machine ? cela rendra les choses un peu plus faciles.Ce n'est pas la même machine ? ce n'est peut-être pas une virgule flottante IEEE...Les données alphabétiques nécessiteraient un traitement différent, mais devraient être plus simples que les données numériques.