web-dev-qa-db-fra.com

Quelle approche pour intégrer Python code dans une application principalement Scala Application avez-vous utilisée une seconde fois parce que c'était un succès?

J'ai une application principalement Scala et je suis intéressé par des approches pour intégrer Python code dans cette application de manière à laquelle vous êtes prouvé personnellement de réussir.

Dans ce contexte

  • intégration des moyens permettant Scala code d'appeler Python code, d'une manière ou d'une autre, et d'utiliser les résultats ou d'accéder à l'exception
  • un moyen de succès signifie que l'approche a été utilisée plus d'une fois parce qu'elle permet aux deux langues de travailler ensemble pour offrir une valeur commerciale et que l'approche a été utilisée une seconde fois par la même équipe.

Espérons que cette question admet des réponses factuelles plutôt que des discussions parce que je demande des observations factuelles. Toutefois, si cela est trop subjectif, alors que vous fermez cela pourriez-vous suggérer un de,

  • Comment puis-je poser cette question de manière non subjective ou
  • Pointez-moi sur un site où je peux poser ce type de question.

Merci.

5
Janek Bogucki

Capturez les résultats via une variable et capturer des exceptions via STERRR comme suit:

à Scala:

import sys.process._
def callPython(): Unit = {
    val result = "python /fullpath/mypythonprogram.py" ! ProcessLogger(stdout append _, stderr append _)
    println(result)
    println("stdout: " + stdout)
    println("stderr: " + stderr)
}

et en python:

try:
    throws()
    return 0
except Exception as err:
    sys.stderr.write(f'Exception: {err}')
    return 1

Pour un examen plus approfondi, voir le processus Package ICI . Visitez également ProcessBuilder ICI et ProcessLogger - ici

4
tale852150

Cela ne sera pas une réponse unique à cela car chaque cas est différent et que toutes les approches ont été utilisées avec succès par différentes équipes.

En général, il y a trois approches:

  1. Si les deux langues ont la même heure d'exécution, vous pouvez compiler à la fois des langues à ce temps d'exécution et utiliser une interface de fonction étranger. Dans ce scénario, vous utilisez Jython and Scala, qui fonctionne tous deux sur JVM. C'est généralement le plus rapide et le moins de frais généraux, mais vous devrez faire face à une certaine impédance dans la manière dont chaque langue traite des objets dans leur langue et que vous n'avez pas d'isolement, un code si mal écrit dans l'une ou l'autre langue peut planter l'autre. De plus, il peut être lourde pour l'élargir à plusieurs machines.
  2. Vous pouvez augmenter les sous-processus lors du traitement de chaque demande dans l'application principale. Le processus principal communiquer avec le sous-processus en diffusant des données en continu à l'aide de STDIN et de STDOUT, et éventuellement d'autres tuyaux ou tout autre système IPC spécifique. Il est généralement préférable que les sous-processus soient un filtre Type de programme pouvant être utilisé dans un pipeline. Il y aura des frais généraux dans la création de sous-processus pour chaque demande principale, mais si vous le faites sur un système basé sur Unix comme Linux, la création de nouveau processus est vraiment rapide car le système est optimisé pour cela.
  3. Vous pouvez créer une communication UTILISATION Inter Process et communiquer avec un microservice à l'aide d'une API de passage de message. Exemple Il s'agit d'exécuter un microservice exécutant un serveur d'applications HTTP ou de communiquer avec des sockets de domaine. Avec cette approche, vous avez des frais générales en raison du rendu, de la copie des messages et de l'analyse des messages, il est donc préférable d'utiliser le mieux lorsque les messages sont grains grossiers plutôt que de faire beaucoup de petits appels. Vous devrez concevoir une API explicite, mais cette approche est généralement plus simple à long terme et peut être rendue plus robuste puisque les accidents sont séparés et ne toucheront pas les autres processus. Cette approche est également beaucoup plus facile à échelle que d'avoir une API explicite le rend plus simple si vous avez besoin d'exécuter les processus sur différentes machines.
3
Lie Ryan