¿Cómo puedo crear una biblioteca independiente de idioma usando Python?

Si creo un paquete en Python, otro usuario de Python puede importar ese paquete e interactuar con él.

¿Cómo puedo crear un paquete para que no importe el idioma con el que el otro usuario está llamando a la biblioteca?

Podría especificar formatos de archivo de entrada y salida para que otro idioma pueda interactuar con mi código Python simplemente proporcionando los archivos de entrada y leyendo los archivos de salida. Sin embargo, crear los archivos de entrada y salida es muy costoso computacionalmente. ¿Hay una solución más fácil?

@ bluprince13 No existe una manera tal de tener una biblioteca que se pueda llamar desde todos los idiomas, al menos no directamente sin el código del contenedor. La interfaz COM en Windows está cerrada, que luego puede ser importada por la mayoría de los progtwigs (como Excel, MATLAB, JAVA), pero esto es un gran problema para escribir.

Cuando dice que la lectura / escritura es una operación costosa, no debe usar las funciones read_csv y to_csv Pandas read_csv son implementaciones rápidas (C ++). Más rápido aún son los archivos binarios HDF5, aunque son más difíciles de usar para la mayoría de los usuarios http://pandas.pydata.org/pandas-docs/version/0.20/io.html read_hdf y to_hdf , que es compatible con muchos idiomas https: //en.wikipedia.org/wiki/Hierarchical_Data_Format . El uso de archivos de entrada y salida hará que su progtwig sea más portátil.

Al usar Python (comstackdo) incrustado, simplemente puede usar las funciones de Python que haya creado en su forma .py ( embedpython.exe en mi enlace de DropBox al final de esta publicación, junto con todos los archivos en el archivo zip allí), que es Probablemente su mejor, más fácil y más rápida ruta para el código fuente / referencia de uso: Python incorporado no funciona apuntando a Python35.zip con NumPy. ¿Cómo solucionarlo? Es la forma más fácil de hacer que su código sea compatible con cualquier sistema, y ​​cambiar entre los scripts de Python es fácil (cuando llama a diferentes bibliotecas, todos los paquetes deben estar disponibles en una subcarpeta). En una instalación de Anaconda Python, los archivos estarán en la carpeta de los paquetes instalados respectivos, generalmente C:\Anaconda3\Lib\site-packages\ [packageName] \ ; las instalaciones típicas de Python se encuentran en C:\Python\Lib\site-packages\ [packageName] \ ). De lo contrario, desde un indicador de comando cd\ donde está instalado Python, dir /s site-packages encontrarán la ubicación. Luego, coloca el directorio de instalación completo para cada paquete en el directorio “extension_modules”. Así que parece que extension_modules\numpy\ , extension_modules\pandas\ , y todas las bibliotecas que está importando (junto con las bibliotecas de las que dependen los paquetes).

Aquí hay algunos ejemplos de cómo llamar al idioma respectivo con el EXE: JAVA: Process process = new ProcessBuilder("C:\\PathToExe\\embedpython.exe","pyscript","pyfunction","input_param1","input_param2").start(); MATLAB: system('"C:\PathToExe\embedpython.exe" pyscript pyfunction input_param1 input_param2') ; VBA: Call Shell("C:\PathToExe\embedpython.exe" "pyscript" "pyfunction" "param1" "param2", vbNormalFocus) C ++: ¿Cómo llamar a un progtwig externo con parámetros? .NET C #: ¿Cómo pasar parámetros a un exe? Como puede ver, la lista sigue y sigue … casi cualquier idioma puede llamar a un archivo EXE. Seguro que desea el máximo rendimiento, pero para obtener compatibilidad en todos los idiomas, debe comprometerse de alguna manera. Pero al usar las sugerencias anteriores, su rendimiento debería ser excelente siempre que las funciones .py estén optimizadas.

Haciendo la vida de todos más fácil aquí está la versión comstackda x64 Python 3.5 Windows NumPy SciPy y Pandas Intel MKL incluidos: https://www.dropbox.com/sh/2smbgen2i9ilf2e/AADI8A3pCAFU-EqNLTbOiUwJa?dl=0

Si es un usuario de Windows, descargue lo anterior y coloque el script .py que desea distribuir, junto con las bibliotecas dependientes en \ extensión_modules \ [nombre_paquete] y su código se ejecutará sin problemas. No especificó si se usará bajo Linux, de modo que esa es mi solución de Windows para su pregunta de “usar desde cualquier idioma” que requiera el mínimo conocimiento de otros lenguajes de progtwigción.

Si desea que otro idioma pueda usar su biblioteca directamente (sin usar ningún tipo de servicio remoto o material de IPC que sea un hervidor de peces completamente diferente), debe escribir enlaces de idioma para él, lo que significa que hay una capa a la que llaman en el idioma de destino que llama a su paquete bajo el capó. Existen varios kits de herramientas para crear esto, pero generalmente es lo que haces si quieres poder llamar a una biblioteca C o C ++ desde un lenguaje de scripts de nivel superior como Python. Por ejemplo, en C existe el proyecto SWIG para ayudar a que sea posible llamar a C desde Python, PHP, Ruby, etc.

Esta página le dará un montón de enlaces de introducción, es un tema grande y difícil para ser honesto. Solo lo he hecho de C a Python yo mismo. https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages

Lo que usted quiere hacer es proporcionar una API a través de un protocolo común como http, y con un formato común para llamadas y respuestas, como un servicio REST. Hay tantos recursos para ayudarlo a comenzar a escribir un servicio web REST con python, como esto:

https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask

Si desea mantenerlo localmente en la máquina y proporcionar la funcionalidad de Python para que se use en los progtwigs localmente, python.org le da una introducción aquí:

https://docs.python.org/2/extending/embedding.html

En el caso general, dos idiomas diferentes no pueden vivir en el mismo proceso. Por lo tanto, debe hacer que un idioma llame a otro a través de la comunicación entre procesos (IPC).

La forma más sencilla y generalmente efectiva de hacerlo es a través de la entrada / salida de la “biblioteca” de calee. Por lo general, tiene algún tipo de sobrecarga de serialización, pero en una típica interacción matlab / python no debería ser perceptible.

En esta configuración, la parte más lenta es el inicio del proceso de Python, que puede suprimirse manteniendo el mismo proceso activo entre dos llamadas.

Aquí hay un ejemplo de ipc entre un progtwig principal en python (pero podría estar escrito en cualquier idioma) y una biblioteca en python usando stdin / stdout y json como serialización


 #main program in foreign language import mylibwrapper print(mylibwrapper.call("add",[1,2])) mylibwrapper.exit() 

 #mylibwrapper.py supposed written in foreign language import subprocess import json process = subprocess.Popen([ "python3", "mylib.py"], stdin = subprocess.PIPE, stdout = subprocess.PIPE, encoding = "utf8") def call(name,args): process.stdin.write(json.dumps([name,args])) process.stdin.write("\n") process.stdin.flush() result = process.stdout.readline() return(result) def exit(): process.terminate() 

 #mylib.py import json, sys def add(arg1,arg2): return arg1 + arg2 if __name__ == "__main__": for line in sys.stdin: name, args = json.loads(line) function = { "add" : add }[name] sys.stdout.write(json.dumps(function( *args))) sys.stdout.write("\n") sys.stdout.flush() 

Puedes usar Cython para extender tu código de Python de manera relativamente fácil para que pueda comstackrse como una biblioteca de C. Principalmente, esto solo implicó reemplazar la palabra clave def con cdef public para las funciones que desea exponer, y anotar los tipos de variables.

Aquí hay un ejemplo de dicho código de Cython:

 cdef public void grail(int num): printf("Ready the holy hand grenade and count to %i", num) 

En ese momento, muchos idiomas tienen interfaces de funciones externas (FFI) a código C.

Como ya se ha mencionado muchas veces, una de las formas es crear una API REST y enviar entradas y salidas a través de HTTP.

Sin embargo, hay otra opción que es más compleja. Puedes usar CORBA (Common Object Request Broker Architecture). Hay una implementación de CORBA en python omniORB . CORBA permite interactuar entre aplicaciones escritas en varios idiomas.

Hay una serie de ejemplos sobre el uso de CORBA con python en la web.

Con un espíritu similar al que Nurzhan menciona anteriormente con respecto a CORBA, puede usar OPC UA: https://en.m.wikipedia.org/wiki/OPC_Unified_Architecture

Es una architecture orientada al control de dispositivos a través de la comunicación de servidor a cliente, pero puede satisfacer sus necesidades. En mi trabajo, hemos utilizado C / C ++ con licencia (Automatización unificada y Java sdks (prosys), opciones de Python exploradas y también soluciones integradas de PLC y la comunicación inter-forma funciona bien.

Hay varios proyectos de código abierto para OPC UA en Python en la web, por ejemplo, freeopcua.