从C调用Python函数并使用C中的2D Numpy数组

从C调用Python函数并使用C中的2D Numpy数组,python,c,arrays,numpy,Python,C,Arrays,Numpy,我在想,我如何才能做到这一点: 我有一个Python脚本,它最终生成一个Numpy数组,更具体地说是一个浮点数组数组。我已经正确设置了所有参数:我可以将参数从C传递到Python,从C启动Py函数,并在C中处理返回的标量值 我目前无法做的是,将这样一个Numpy数组作为Py函数的结果返回给C 有没有人能给我一个指针,如何做到这一点 TIA您需要了解的是进程间通信(IPC)。有几种方法可以实现它 您可以使用以下选项之一: 文件(易于使用) 共享内存(非常快) 命名管道 插座(慢) 查看并找到满

我在想,我如何才能做到这一点:

我有一个Python脚本,它最终生成一个Numpy数组,更具体地说是一个浮点数组数组。我已经正确设置了所有参数:我可以将参数从C传递到Python,从C启动Py函数,并在C中处理返回的标量值

我目前无法做的是,将这样一个Numpy数组作为Py函数的结果返回给C

有没有人能给我一个指针,如何做到这一点


TIA

您需要了解的是进程间通信(IPC)。有几种方法可以实现它

您可以使用以下选项之一:

  • 文件(易于使用)
  • 共享内存(非常快)
  • 命名管道
  • 插座(慢)

查看并找到满足您需求的最佳方法。

您需要查看的是进程间通信(IPC)。有几种方法可以实现它

# 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]
您可以使用以下选项之一:

  • 文件(易于使用)
  • 共享内存(非常快)
  • 命名管道
  • 插座(慢)

查看并找到适合您需要的最佳方法。

这里是一个小型的工作演示示例(1D,而不是2D阵列!它并不完美,请根据您的需要进行调整)

# 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]
~demo.c

// 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;
}

a
将是您想要的结果,一组
float

这里是一个小的工作演示示例(1D,而不是2D数组!它并不完美,请根据您的需要进行调整)

~demo.c

// 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;
}

a
将是您想要的结果,一个
float

数组必须使用PylistAPI将列表对象从Python解码为C


已解决。

必须使用PylistAPI将列表对象从Python解码为C


已解决。

您能展示一下您到目前为止所做的尝试吗?您所说的“将Py函数的结果返回给C”是什么意思?将返回的numpy数组存储到一个由
float
-s组成的数组中?您能否用一个简短的示例说明您到底想要实现什么?如果我理解正确的话,您需要将从C程序调用的python函数的输出存储到一些C变量中,对吗?谢谢所有的注释@拉胡尔巴拉德瓦伊:现在我什么都没试过,因为我没有线索。我只能从python返回一个标量。基本上这是一个python级别的列表,一个包含192个列表的列表,每个列表包含640个浮点数,我需要将其传递给C,以显示您到目前为止所做的尝试?您所说的“将Py函数返回到C的结果返回这样一个Numpy数组”是什么意思?将返回的numpy数组存储到一个由
float
-s组成的数组中?您能否用一个简短的示例说明您到底想要实现什么?如果我理解正确的话,您需要将从C程序调用的python函数的输出存储到一些C变量中,对吗?谢谢所有的注释@拉胡尔巴拉德瓦伊:现在我什么都没试过,因为我没有线索。我只能从python返回一个标量。基本上,这是一个python级别的列表,一个包含192个列表的列表,每个列表包含640个浮点数,我需要将其传递给CThanks,但这不是我想要的。谢谢,但这不是我想要的。不,我已经在C应用程序中运行了python脚本plus解释器。不,我已经在C应用程序中运行了Python脚本加解释器。