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