Ejecutar un exe de Python desde Ejecutar programa()Tengo un ejecutable de Python (por lo que yo u otros no necesitamos Python instalado en la PC) que puede analizar algunos datos...
Me gustaría llamar y ejecutar esto desde JMP, pero no estoy seguro de cuál es la mejor manera, ya que me gustaría poder alimentar variables a este python exe desde JMP y obtener el retorno.
He hecho esto con éxito usando los comandos integrados de Python, pero nunca con un archivo exe de Python. Una de las variables que necesitaría introducir es una tabla de datos. Actualmente necesitaría que JMP guarde la tabla como .csv en una ubicación temporal, luego este python exe puede ejecutar y editar ese .csv... luego JMP puede abrir el CSV actualizado (no tengo esa secuencia codificada en JSL ya que siento que debe haber una mejor manera)
¿Alguna idea? Tengo una experiencia mínima con Run Command(), por lo que se agradecerá cualquier sugerencia inicial 
¡Gracias!
Modelado estadístico avanzadoAutomatización y secuencias de comandosInvestigación de Consumidores y MercadosAcceso a los datosLa personalización en masaRe: Ejecutar un exe de Python desde Ejecutar programa()Hay un ejemplo práctico en Hacer un vídeo en JMP con FFmpeg . Está utilizando el ejecutable FFmpeg, no un ejecutable de Python, pero muestra tanto la lectura desde la salida estándar como la escritura en la entrada estándar. La función de lectura simplemente hace eco en el registro JMP, pero puede almacenar el texto en un buffer y hacer algo más si lo desea. La función de escritura transmite imágenes a FFmpeg para codificarlas, una a la vez.
Con FFmpeg, es útil tener un eco en tiempo real en el registro JMP a medida que las imágenes se pasan a FFmpeg; me permite ver si algo anda mal en medio de un largo proceso. Si tiene un proceso más corto, con una salida única (posiblemente grande) al final, le resultará más conveniente usar readfunction("text" o "blob") que permite a JMP almacenar en buffer la salida estándar en una sola cadena que es regresó. Tampoco es necesario esperar (ver el final del ejemplo) a que finalice RunProgram para obtener los resultados. Por otro lado, el uso de readfunction(function(...)) permite que JMP comience a procesar la salida mientras se genera.
Si el programa Python genera un CSV en la salida estándar, la función de lectura debería usar un blob por dos razones (aunque los datos deberían ser ASCII de 7 bits): un blob puede tener más de 2 GB, pero una cadena JSL no, y usted puede cargar la mancha como dt = abrir(blobVariable, "csv") . Coloque un encabezado en el CSV y será útil incluso si solo necesita devolver algunos valores con nombre como una tabla con una sola fila.
Hay un código Python de ejemplo enterrado en Beowulf, Newton y el señor Hanson que lee los parámetros de la línea de comando - busque optar --, pero probablemente puedas encontrar ejemplos más fáciles de usar en otros lugares. En ese ejemplo, JMP usa plink (de PuTTY) para ejecutar Python en una máquina remota y usa un disco NFS en la red para compartir datos.
Re: Ejecutar un exe de Python desde Ejecutar programa()Sí, diría que vale la pena probarlo. Ejecuté una función de escritura/lectura de flujo similar en Unix para pasar de un marco de datos Pandas muy grande a una tabla de Postgres y es increíblemente rápido. No sé cómo es la implementación de JMP, pero ¿tal vez puedas escribir toda la tabla en la entrada estándar de una sola vez? Como una lista gigantesca de listas tal vez...
Como referencia, probé el método Python en un marco de datos de Pandas que tenía un tamaño aproximado de 3 GB y tardó menos de 10 segundos en completarse. El método es este:
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 encontré en algún sitio hace mucho tiempo (no soy tan inteligente;) ). Utiliza un iterador de datos y los escribe fila por fila en la entrada estándar del cursor de Postgres, pero sigue siendo extremadamente rápido.
Re: Ejecutar un exe de Python desde Ejecutar programa()La ventaja de CSV o Pandas es que no es necesario analizar la salida de Python. Si su salida parece csv, puede recibirla como readprogram(blob) y abrir el blob con la opción csv para obtener una tabla.Re: Ejecutar un exe de Python desde Ejecutar programa()@Michael_MXAK Hmm, esa también es una idea interesante. Para archivos más pequeños puede funcionar bien. Algunos de estos archivos pueden volverse bastante grandes, por lo que el método línea por línea puede no ser demasiado eficiente... Sin embargo, es un gran motivo de reflexión.
Re: Ejecutar un exe de Python desde Ejecutar programa()@Craige_Hales Ok, eso tiene sentido... ahí es donde me estaba inclinando, pero enviar la información a la cadena para su recuperación sería más fácil de manejar que un segundo csv.
Re: Ejecutar un exe de Python desde Ejecutar programa()No he hecho esto y no puedo probarlo fácilmente en mi sistema en este momento, pero parece que puedes leer desde la salida estándar de un ejecutable y escribir en los flujos estándar de un ejecutable usando JSL: https://community.jmp.com/kvoqx44227/attachments/kvoqx44227/discovery-2016-content/67/1/Run%20Program.pdf
Python puede leer desde stdin (y enviar a stdout) como una operación similar a un archivo: Python: stdin, stdout y stderr - AskPython
Así que estoy razonablemente seguro de que podría ` << Escribir` su tabla de datos línea por línea en la entrada estándar del ejecutable de JMP, usar un método similar a un archivo para leer las líneas de JMP en Python, construir esas líneas en un Marco de datos de Pandas, ejecute sus operaciones de Python, luego envíe el marco de datos de Pandas línea por línea desde Python a la salida estándar y envíelo de regreso a JMP.
Re: Ejecutar un exe de Python desde Ejecutar programa()Usar un ejecutable creado a partir de un programa Python a través de RunProgram o llamar al intérprete de Python con el script Python desde RunProgram es similar. Ninguno de los dos tiene la integración que tiene el uso de Python integrado. Necesitará usar algo como un archivo CSV para enviar datos al programa Python y recuperar datos del programa Python. También puede pasar parámetros de línea de comando al .exe. (O al intérprete de Python).
En su caso, sugeriría escribir el CSV en el directorio $temp e imprimir los resultados en Python. Pase la ruta csv a través de la línea de comando. Utilice RunProgram(...readfunction("text")...) para recuperar la cadena de salida impresa. elimine el archivo del directorio temporal.