Il est possible d’échanger des données entre deux programmes via du texte au format JSON. Lorsqu’un système utilise différents processus, il est intéressant de pouvoir échanger des données entre tâches. Une méthode possible est d’utiliser un texte dans un format facilement navigable tel que le JSON, CSV ou XML.
Le fichier JSON
Le fichier JSON représente un format facile à déchiffrer pour un humain ou pour un ordinateur. Il est aussi très facile à décoder pour un script python qui l’interprète comme un dictionnaire.
Le programme de calcul en C
Nous allons tout d’abord créer un programme en C qui accepte des paramètres en ligne de commande et qui renvoie des données au format JSON
- compute.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { double num1; char* op; double num2; double result = 0.0; //confirm number of arguments if (argc == 4) { num1 = atof(argv[1]); op = argv[2]; num2 = atof(argv[3]); }else{ num1 = 2; op = "+"; num2 = 3; } // Effectuer le calcul if (strcmp(op, "+") == 0) { result = num1 + num2; } else if (strcmp(op, "-") == 0) { result = num1 - num2; } else if (strcmp(op, "*") == 0) { result = num1 * num2; } else if (strcmp(op, "/") == 0) { if (num2 == 0) { fprintf(stderr, "{\"status\": \"error\", \"message\": \"division by zero\"}\n"); return 1; } result = num1 / num2; } else { fprintf(stderr, "{\"status\": \"error\", \"message\": \"Unknown operator (+, -, *, or /)\"}\n"); return 1; } //print JSON text printf("{"); //start print JSON // Print data printf("\"calculus\":{"); printf("\"num1\":%.2f,", num1); printf("\"op\":\"%s\",", op); printf("\"num2\":%.2f,", num2); printf("\"result\":%.2f", result); printf("}"); // End data printf("}"); // End print JSON return 0; }
A ce stade, nous pouvons compiler le programme et tester la sortie au format JSON.
gcc compute.c -o compute.exe && ./compute.exe
On peut écrire le résultat directement dans un fichier texte pour vérifier le résultat ou pour lire le fichier dans un second temps
gcc compute.c -o compute.exe && ./compute.exe > result.json
Le programme d’analyse Python
Dans un second temps, nous allons créer un script Python qui va lancer le programme C et récupérer les données au format JSON.
- analyze.py
import subprocess import json import sys executable = "compute.exe" #print(f"Run {executable}") command = [f"./{executable}", "42.5", "*", "10"] result = subprocess.run( command, capture_output=True, # Capturer stdout et stderr text=True, # Décoder la sortie en texte (UTF-8) check=True # Lever une exception pour les codes de sortie non nuls ) # Display result json_output_string = result.stdout print(f"Raw json: {json_output_string.strip()}") # Parse JSON data = json.loads(json_output_string) calculus = data['calculus'] print("--- Output ---") print(f"{calculus['num1']} {calculus['op']} {calculus['num2']} = {calculus['result']}")
Pour lancer le script python
$ python3 -m analyze Raw json: {"calculus":{"num1":42.50,"op":"*","num2":10.00,"result":425.00}} --- Output --- 42.5 * 10.0 = 425.0
Application
On pourrait imaginer que les deux programmes sont exécuter à des moments totalement indépendant. Dans ce cas, il serait judicieux d’écrire et de lire un fichier ou d’utiliser une mémoire partagée.