将 python 对象导入 JMP 的最佳方法<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我有一些 python 代码可以在 15 分钟内生成大约 3 GB 的数据。目前,它正在将数据作为“列” value1|value2|value3.. 行流式传输到文本文件,然后进行一些后处理,将整个文本文件转换为 jmp 可以打开的 csv。拆分值后,csv 文件最多可包含约 30k 列和 100 到 10k 行。
为了使数据更快地到达 JMP,我想将文本数据直接从 python 会话的内存流式传输到 jmp 会话中。
我已经尝试使用 pycom 进行一些 ole 自动化,但似乎对 pycom 的调用非常慢,这使得很难在每一行上进行迭代并为该“行”中生成的几个值更新正确的行。
还有别的办法吗? sqlite内存表? JSL插座?JMP python API?
回复:将 python 对象导入 JMP 的最佳方法克雷格,
没有太大帮助,但它在 JMP 13 中也可以这样工作。必须询问 JMP 支持...也许它会在 JMP 14 中得到修复
回复:将 python 对象导入 JMP 的最佳方法感谢您查看它,这是个好问题。
我认为您正在与文件名中嵌入空格的 Windows 命令行行为作斗争。在 DOS 框中,您可以像这样使用引号:

转义有点难看,但在 JSL 中是这样的:
runprogram(executable("cmd.exe"), options({"/C","dir \!"c:\Users\chales\Saved Games\!""}), readfunction("text"))我办公室没有 python,但我预计它会有相同的行为。如果需要嵌入引号,情况会变得更糟;我正在从事的另一个项目使用了 \",如其中一个答案中所述http://stackoverflow.com/questions/7760545/cmd-escape-double-quotes-in-parameter
如果您要为项目选择路径名,则省略空格会更容易。如果您有文件选择器,则需要允许它们。
回复:将 python 对象导入 JMP 的最佳方法使用运行程序的非常酷的方式
我没有解决方案,但这适用于 Mac 上的 JMP 12.1
f = Pick File();
x = RunProgram(
executable("/usr/bin/python"),
options(f),
readfunction("blob")
);
回复:将 python 对象导入 JMP 的最佳方法克雷格@JMP
我在运行程序时遇到问题,这似乎与我用于运行程序的选项和文件名有关。如果我使用 pick file(),它会崩溃。或者如果我硬编码一个包含空格的目录。
您有什么建议可以让这种动态变得活跃吗?使用 JMP 12.0.1。
例子
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")
);
回复:将 python 对象导入 JMP 的最佳方法下面是一个完整的示例,大约 2 秒内运行 1,000,000 个双打:
python 代码构建一个双精度数组,生成一个二进制字节字符串,并将字节写入标准输出。如果您愿意,可以使用文件,只需确保它以二进制模式 (wb) 打开即可。包格式开头的“">”表示“大端”。
“生成.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) JSL 使用 runProgram 来运行 python 程序,并从 stdout 读回一个 blob。BlobToMatrix 指定“big”以匹配大端数据。如果让 python 程序单独运行并写入文件,则可以使用 LoadTextFile( ...BLOB ) 而不是 runProgram。您仍然需要 blobToMatrix。
“获取.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); 好的=“好”;
http://stackoverflow.com/questions/2374427/python-2-x-write-binary-output-to-stdout有二进制换行问题的答案。
回复:将 python 对象导入 JMP 的最佳方法我认为您可以使用以下命令在 python 和 JMP 之间移动 IEEE 浮点数据或整数7.1. struct — 将字节解释为打包的二进制数据 — Python 3.5.0 文档在 python 端,blobToMatrix 在 JMP 端。二进制和字符之间的转换以及返回二进制的转换不会大大加快速度。 在它们之间使用文件或套接字。他们在同一台机器上吗?这会让事情变得更容易一些。不是同一台机器吗?可能不是 IEEE 浮点...字符数据需要不同的处理,但应该比数字更容易。