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
3 Réponses :
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:
Consultez la page IPC de Wikipedia et trouvez la meilleure approche pour vos besoins. p>
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
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 .
Merci, mais ce n'était pas ce que je cherchais.
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.
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