fbpixel

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.

Source