从 Run program() 执行 python exe我有一个 python 可执行文件(所以我或其他人不需要在电脑上安装 python),它可以分析一些数据......
我想从 JMP 调用并运行它,但我不确定最好的方法,因为我希望能够从 JMP 向这个 python exe 提供变量并获得返回。
我已经使用集成的 python 命令成功完成了此操作,但从未使用独立的 python exe 文件。 我需要输入的变量之一是数据表。 目前,我需要让 JMP 在临时位置将表保存为 .csv,然后这个 python exe 可以运行并编辑该 .csv ...然后 JMP 可以打开更新的 CSV(我没有对该流进行编码)在JSL中,因为我觉得一定有更好的方法)
有什么想法吗? 我对 Run Command() 的经验很少,因此任何起始指针将不胜感激:)
谢谢!
高级统计建模自动化和脚本编写消费者和市场研究数据存取大规模定制回复:从 Run program() 执行 python exe有一个工作示例使用 FFmpeg 在 JMP 中制作视频。 它使用 FFmpeg 可执行文件,而不是 python 可执行文件,但它确实显示从 stdout 读取和写入 stdin。 读取函数仅回显 JMP 日志,但您可以缓冲文本并根据需要执行其他操作。 写入功能将图像流式传输到 FFmpeg 进行编码,一次一个。
使用 FFmpeg,当图像传递到 FFmpeg 时,实时回显 JMP 日志非常有用;它让我可以看到在漫长的过程中是否出现了问题。 如果您的流程较短,最后只有一个(可能很大)输出,您会发现使用 readfunction("text" 或 "blob") 更方便,它可以让 JMP 将标准输出缓冲到单个字符串中,即回。 它也不需要等待(参见示例末尾)RunProgram 终止即可获取结果。 另一方面,使用 readfunction(function(...)) 确实允许 JMP 在生成输出时开始处理输出。
如果 python 程序将 CSV 输出到 stdout,则 readfunction 应使用 blob,原因有两个(即使数据应为 7 位 ASCII): blob 可以大于 2GB,但 JSL 字符串不能,并且您可以加载斑点为dt = open( blobVariable, "csv") 。 在 CSV 上添加标题,即使您只需要以单行表的形式返回一些命名值,它也很有用。
有一些示例 python 代码埋在贝奥武夫、牛顿和汉森先生读取命令行参数——搜索获取选择--,但是您可能可以在其他地方找到更容易使用的示例。 在该示例中,JMP 使用 plink(来自 putty)在远程计算机上运行 python,并使用网络上的 NFS 磁盘来共享数据。
回复:从 Run program() 执行 python exe是的,我想说这值得测试。 我在 Unix 上运行了一个类似的流写入/读取功能,用于从非常大的 Pandas 数据帧到 Postgres 表,而且速度非常快。 我不知道JMP的实现是什么样的,但也许你可以一次性将整个表写入stdin? 作为一个巨大的列表列表也许......
作为参考,我在大小约为 3 GB 的 Pandas 数据帧上测试了 Python 方法,完成时间不到 10 秒。 方法是这样的:
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)我很久以前在某个网站上发现的(我没那么聪明;) )。 它使用数据迭代器并将其逐行写入 postgres 游标的标准输入,但它仍然非常快。
回复:从 Run program() 执行 python exeCSV 或 Pandas 的优点是您不必解析 python 输出。 如果您的输出看起来像 csv,您可以将其作为 readprogram(blob) 接收,并使用 csv 选项打开 blob 以获取表格。回复:从 Run program() 执行 python exe@迈克尔_MXAK嗯,这也是一个有趣的想法。 对于较小的文件,它可能工作得很好。 其中一些文件可能会变得相当大,因此逐行方法可能不会过于高效...... 不过,这确实是一个值得深思的话题。
回复:从 Run program() 执行 python exe@Craige_Hales好吧,这是有道理的......这就是我所倾向于的地方,但是将信息输出到字符串中进行检索比处理第二个 csv 更容易。
回复:从 Run program() 执行 python exe我还没有这样做,目前无法在我的系统上轻松测试它,但看起来您可以使用 JSL 从可执行文件的 stdout 读取并写入可执行文件的 stdin 流: https://community.jmp.com/kvoqx44227/attachments/kvoqx44227/discovery-2016-content/67/1/Run%20Program.pdf
Python 可以从 stdin 读取(并输出到 stdout)作为类似文件的操作: Python - 标准输入、标准输出和标准错误 - AskPython
因此,我相当确定您可以将数据表逐行写入 JMP 可执行文件的标准输入,使用类似文件的方法从 Python 中的 JMP 读取行,将这些行构造为Pandas 数据帧,运行 Python 操作,然后将 Pandas 数据帧从 Python 逐行输出到标准输出,并将其反馈回 JMP。
回复:从 Run program() 执行 python exe使用通过 RunProgram 从 Python 程序构建的可执行文件,或者使用 RunProgram 中的 Python 脚本调用 Python 解释器是类似的。 两者都没有使用集成 Python 所具有的集成性。 您需要使用 CSV 文件之类的文件将数据发送到 Python 程序并从 Python 程序取回数据。 您还可以将命令行参数传递给 .exe。 (或者到 python 解释器。)
对于你的情况,我建议将 CSV 写入 $temp 目录并在 python 中打印结果。 通过命令行传递 csv 路径。 使用 RunProgram(...readfunction("text")...) 检索打印输出的字符串。删除临时目录文件。