Présentation du "jsii" magique qui exécute des programmes écrits en TypeScript avec Python, etc.

Tout d'abord, si vous écrivez à partir de la conclusion, vous pouvez faire quelque chose comme la figure ci-dessous.

image.png

Ceci est un exemple d'exécution du programme écrit en TypeScript affiché sur la face supérieure du programme Python sur la face inférieure.

Il utilise une bibliothèque appelée jsii pour convertir ** les programmes TypeScript en bibliothèques compatibles Python **. Comme le document officiel dit "la magie opère", c'est une technique magique.

jsii peut être utilisé dans des langages tels que Java en plus de Python, mais dans cet article, un programme écrit en TypeScript est exécuté en Python.

Faisons-le réellement.

Environnement d'exécution de cet article

Essayez d'utiliser jsii

Vous pouvez utiliser jsii à peu près dans le flux suivant.

  1. Écrivez le programme en TypeScript
  2. Créez des packages dans d'autres langues en utilisant jsii
  3. Installer et utiliser à partir d'autres langues

Ecrire un programme TypeScript

À titre d'exemple, écrivez un programme FizzBuzz approprié dans lib / index.ts avec TypeScript.

lib/index.ts


export class MyClass {
  fizzBuzz(arg: number): string {
    if (arg % (3 * 5) === 0) {
      return 'FizzBuzz';
    } else if (arg % 3 === 0) {
      return 'Fizz';
    } else if (arg % 5 === 0) {
      return 'Buzz';
    }
    return arg.toString();
  }
}

Si vous voulez vérifier l'opération en l'exécutant normalement en tant que TypeScript, exécutez-la par votre méthode préférée telle que $ npx ts-node lib / index.ts.

Description de package.json

jsii utilise les informations de package.json au moment de la construction pour enregistrer les méta-informations des bibliothèques dans chaque langue. Par conséquent, jsii ne peut pas être utilisé à moins que package.json ne soit écrit" correctement "dans une certaine mesure.

Voici un exemple de réglage.

package.json


{
  "name": "jsii-example",
  "version": "1.0.0",
  "main": "lib/index.js",
  "types": "lib/index.d.ts",
  "author": "your_name",
  "repository": {
    "url": "https://example.com",
    "type": "Git"
  },
  "license": "MIT",
  "jsii": {
    "outdir": "dist",
    "targets": {
      "python": {
        "distName": "your_name.jsii_example",
        "module": "your_name.jsii_example"
      }
    }
  },
  "devDependencies": {
    "jsii": "^0.20.6",
    "jsii-pacmak": "^0.20.6"
  }
}

Comme mentionné ci-dessus, les parties qui sont généralement omises telles que «référentiel» et «auteur» sont requises lors de l'utilisation de jsii. De plus, les types «main» et «types» doivent être spécifiés dans le même répertoire que «lib / index.ts».

De plus, en tant que paramètre spécifique à jsii, décrivez les informations pour chaque package de langue à l'emplacement appelé jsii. Cette fois, afin de construire le package Python, les informations sur le nom du module sont décrites comme «python» dans les «cibles».

Construire avec jsii

Installez les packages requis pour exécuter la compilation jsii.

$ npm install --save-dev jsii jsii-pacmak
$ echo "jsii
wheel
publication" > requirements.txt
$ pip install --require requirements.txt

Une fois l'installation ci-dessus terminée, compilez avec la commande jsii et le package avec la commande jsii-pacmak.

$ npx jsii
$ npx jsii-pacmak

Il réussit si votre_nom.jsii_example-1.0.0.tar.gz est créé dans le répertoire dist / python.

Exécuter à partir de Python

Installez le fichier de package créé précédemment en tant que bibliothèque Python.

$ pip install dist/python/your_name.jsii_example-1.0.0.tar.gz

Importez cette bibliothèque et écrivez un programme Python qui appelle la fonction fizzBuzz.

python.py


import your_name.jsii_example

obj = your_name.jsii_example.MyClass()

print(obj.fizz_buzz(2))
print(obj.fizz_buzz(3))
print(obj.fizz_buzz(5))
print(obj.fizz_buzz(15))

Il est enfin temps de courir.

$ python python.py 
2
Fizz
Buzz
FizzBuzz

J'ai pu appeler du code écrit en TypeScript depuis Python!

Utiliser jsii avec Docker

Puisque la construction de l'environnement d'exécution décrite jusqu'à présent nécessite l'installation de plusieurs langages, c'est un peu gênant, donc cette fois nous avons préparé un Dockerfile qui peut préparer Python et Node.js requis pour l'exécution de jsii ensemble.

FROM python:3.7.5-slim

ENV DIR /app
WORKDIR $DIR
RUN apt update && apt install -y nodejs npm

# setup python
COPY requirements.txt $DIR
RUN pip install --requirement requirements.txt

# setup node
COPY package.json $DIR
RUN npm install

# main: lib/index.ts
COPY lib/ $DIR/lib

Après avoir préparé le package.json, requirements.txt, lib / index.ts mentionné ci-dessus, utilisez-le comme suit.

$ mkdir dist
$ docker build --tag jsii-example .
$ docker run --rm --volume $(pwd)/dist:/app/dist jsii-example /bin/bash -c 'npx jsii && npx jsii-pacmak'

Il réussit si le fichier de package est généré sous dist /.

Comment fonctionne jsii

Le mécanisme de jsii est expliqué dans la documentation jsii. jsii/runtime-architecture.md at master · aws/jsii

Lorsque le code hôte tel que Python atteint le point d'utilisation jsii, il semble que le processus enfant du nœud est démarré, le programme est exécuté et le résultat est reçu par Python. Si vous regardez dans le répertoire / tmp sur votre hôte, vous trouverez la preuve d'une installation npm temporaire du programme.

La documentation indique également que ** les performances sont sacrifiées ** car le traitement qui se termine à l'origine avec Python dépend également de la communication avec Node.js. Il est difficile pour jsii de fonctionner dans des applications qui nécessitent des performances telles que des environnements de production, et il devrait être utilisé dans les outils de développement et de construction.

Exemple d'utilisation de jsii

jsii est un OSS développé par AWS. À titre d'exemple d'utilisation réel, jsii est utilisé dans AWS CDK, qui est un outil d'infrastructure en tant que code fourni par AWS. Comme jsii, aws-cdk vous permet d'écrire des configurations d'infrastructure en TypeScript, Python, .NET et Java.

Cité dans AWS Cloud Development Foire aux questions

AWS crée la logique métier du package de bibliothèque AWS Construct dans TypeScript et fournit un mappage vers chaque langage de programmation pris en charge. Cela garantit que les constructions AWS CDK se comportent de manière cohérente dans différentes langues et peuvent fournir un ensemble complet de packages de construction disponibles dans toutes les langues. Tout le code créé dans le projet AWS CDK est natif du langage de programmation de votre choix. Le runtime JavaScript est une implémentation détaillée de votre expérience de programmation. Le projet jsii peut être trouvé à https://github.com/aws/jsii.

Tips --Il existe des restrictions sur le TypeScript qui peuvent être exécutées avec jsii.

Résumé

En utilisant jsii, j'ai pu exécuter un programme écrit en TypeScript dans le code source Python. Bien qu'il soit encore en cours de développement et soumis à de nombreuses restrictions, il a un certain avenir car il est en fait utilisé dans AWS CDK. Si vous souhaitez utiliser un outil créé avec une base de code à partir de plusieurs langues, je pense que ce jsii est une option.

Le programme utilisé cette fois est également posté sur GitHub. Si vous êtes intéressé, jetez un œil. https://github.com/s2terminal/jsii-example

Recommended Posts

Présentation du "jsii" magique qui exécute des programmes écrits en TypeScript avec Python, etc.
Convertir des fichiers écrits en python, etc. en pdf avec la coloration syntaxique
Test de stress avec Locust écrit en Python
Afficher Python 3 dans le navigateur avec MAMP
[Python] Récupérez les fichiers dans le dossier avec Python
Celui qui affiche la barre de progression en Python
Formules qui apparaissent dans Faire des mathématiques avec Python
L'histoire qui s'inscrit dans l'installation de pip
Présentation du livre "Créer une IA rentable avec Python" qui vous permet d'apprendre l'apprentissage automatique dans le cours le plus court
[Python] Ne laissez que les éléments commençant par une chaîne de caractères spécifique dans le tableau
[Python] Obtenez les nombres dans l'image graphique avec OCR
Utilisez Cursur qui se ferme automatiquement avec sqlite3 en Python
Explorez l'URL contenue dans le tweet Twitter avec python
Convertissez l'image au format .zip en PDF avec Python
Obtenez des résultats au format dict avec Python psycopg2
Ecrire des caractères dans l'illustration de la carte avec OpenCV python
Trouvez la partie 575 de Wikipedia en Python
Un mémo que j'ai touché au magasin de données avec python
Modules pouvant passer par le shell en Python
Essayez de gratter les données COVID-19 Tokyo avec Python
Créons un script qui s'enregistre avec Ideone.com en Python.
Utilisez une macro qui s'exécute lors de l'enregistrement de python avec vscode
[CleanArchitecture with Python] Partie 2: Couche Frameworks & Drivers: Présentation du Web
[Homologie] Comptez le nombre de trous dans les données avec Python
Histoire que Python a cessé de travailler avec VS Code (Windows 10)
À propos de netaddr qui gère l'adresse IP, le CIDR, etc. en Python
Si vous pensez que la personne que vous mettez avec pip ne fonctionne pas → Utilisez-vous python3 par hasard?
J'ai acheté et analysé la loterie jumbo de fin d'année avec Python qui peut être exécutée dans Colaboratory
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python