1
votes

Appeler une fonction Python à partir de C et consommer un tableau Numpy 2D en C

J'essaie de comprendre comment je pourrais y parvenir:

J'ai un script Python, qui à la fin produit un tableau Numpy, un tableau de tableaux de flottants, pour être plus précis. J'ai tout correctement défini: je peux passer des paramètres de C à Python, lancer des fonctions Py à partir de C et traiter les valeurs scalaires renvoyées en C.

Ce que je ne suis pas en mesure de faire actuellement, c'est de renvoyer un tel tableau Numpy suite à une fonction Py à C.

Quelqu'un pourrait-il probablement me fournir un pointeur, comment y parvenir?

TIA


4 commentaires

Pouvez-vous montrer ce que vous avez essayé jusqu'à présent?


Qu'entendez-vous par "renvoyer un tel tableau Numpy à la suite d'une fonction Py à C"? Stocker le tableau numpy retourné dans un tableau de float -s?


Pourriez-vous illustrer par un court exemple ce que vous essayez de réaliser exactement? Si je comprends bien, vous devez stocker la sortie de la fonction python appelée à partir d'un programme C vers certaines variables C, non?


Merci pour tous vos commentaires. @RahulBharadwaj: Pour le moment, je n'ai rien essayé, car je n'en ai aucune idée. Je suis juste capable de renvoyer un scalaire de python. Fondamentalement, c'est une liste au niveau de python, une liste contenant 192 listes de 640 flotteurs chacune, que je dois passer à C


3 Réponses :


0
votes

Ce que vous devez examiner, c'est la communication inter-processus (IPC). Il existe plusieurs façons de l'exécuter.

Vous pouvez utiliser l'un des éléments suivants:

  • Fichiers (faciles à utiliser)
  • Mémoire partagée (très rapide)
  • Canalisations nommées
  • Sockets (lent)

Consultez la page IPC de Wikipedia et trouvez la meilleure approche pour vos besoins.


1 commentaires

Non, j'ai déjà le script Python plus l'interpréteur en cours d'exécution dans l'application C. docs.python.org/3.6/extending/extending.html



0
votes

Voici un petit exemple de démonstration fonctionnel ( 1D, pas un tableau 2D! ce n'est pas parfait, ajustez-vous à vos besoins).

# cc demo.c
# ./a.out
Python script output: [0.23286839 0.54437959 0.37798547 0.17190732 0.49473837 0.48112695 0.93113395 0.20877592 0.96032973 0.30025713]

0.23286839
0.54437959
0.232868
0.544380
0.377985
0.171907
0.494738
0.481127
0.931134
0.208776
0.960330
0.300257

~ demo.c p>

// file ./demo.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
        int fd[2];
        pipe(fd); // create pipes
        char buf[4096];

        pid_t pid=fork();
        if (pid==0) { // child process

                dup2(fd[1],1);
                close(fd[0]);
                close(fd[1]);

                char *pyscript = "./pyscript.py";
                char *args[] = {"python3", pyscript, (char*)NULL};
                execv("/usr/bin/python3",args);

        }
        else {
                int status;
                close(fd[1]);
                int bytes = read(fd[0], buf, sizeof(buf));
                printf("Python script output: %.*s\n", bytes, buf);

                char* values[10];
                int count = 0;
                values[count++] = &buf[1]; // ignore the '[' coming from numpy array output
                char* p = buf;
                while (*p) {
                        if (*p == ' ') {
                                *p = 0;
                                values[count++] = p + 1;
                        }
                        p++;
                }

                float a[10];
                float f;
                for (int i = 0; i < 10; i++) {
                        printf("%f\n", f = atof(values[i]) ); // float values
                        a[i] = f;
                }

                waitpid(pid, &status, 0);
        }
        return 0;
}

Exemple de sortie

# file ./pyscript.py
import numpy as np

# print inline
np.set_printoptions(linewidth=np.inf)
x = np.random.random(10)
print(x)
# [0.52523722 0.29053534 0.95293405 0.7966214  0.77120688 0.22154705 0.29398872 0.47186567 0.3364234  0.38107864]

a sera le résultat souhaité, un tableau de float .


1 commentaires

Merci, mais ce n'était pas ce que je cherchais.



0
votes

Il faut utiliser l'API PyList pour décoder les objets de liste de Python vers C

https://docs.python.org/3.3 /c-api/list.html?highlight=m

Résolu.


0 commentaires