我刚开始学习C语言,正在尝试为我的Python编写后端。目前我有一个笨重的系统,需要从Python中编写大量的输入文件(至少10^6个浮点数),然后初始化C(还必须加载许多其他数据),运行C直到终止,接收其输出,然后只能重新使用新的输入数组重新初始化它。
我不确定从外观上来看是否在概念上可能,但我希望能够将C直接指向numpy数组的内存地址,并像使用C创建的数组一样使用它。目标是Python初始化C,构建其第一个数组,运行C代码,直到准备好下一个数组,然后由Python生成。
这是一些我编写的虚拟代码,用于尝试让C读取numpy数组。目前,C只会导致分段错误,我不确定是因为我不擅长C,它不喜欢读取numpy数组还是两者都有问题。
Front.py
array_interface源自此处。
我不确定从外观上来看是否在概念上可能,但我希望能够将C直接指向numpy数组的内存地址,并像使用C创建的数组一样使用它。目标是Python初始化C,构建其第一个数组,运行C代码,直到准备好下一个数组,然后由Python生成。
这是一些我编写的虚拟代码,用于尝试让C读取numpy数组。目前,C只会导致分段错误,我不确定是因为我不擅长C,它不喜欢读取numpy数组还是两者都有问题。
Front.py
array_interface源自此处。
#! /usr/bin/python
import numpy as np
import subprocess as sp
ray = np.array([x*3.14 for x in range(10)])
addr = ray.__array_interface__['data'][0]
pro = sp.Popen(['./back', hex(addr)])
print pro.communicate()[0]
print ray[:5]
quit()
Back.c
#include <stdio.h>
#include <stdlib.h>
int main(char *argv[])
{
float *addr;
int n;
float a[10];
// Hopefully making a pointer to the first float in the np.ndarray
addr = sscanf(argv[1], "%x");
n = 0;
while( n<10 )
{
// Hopefully stepping through the np.ndarray one float at a time.
a[n] = *addr;
addr++;
n++;
}
// Return the first five values to compare with python.
fprintf(stdout, '%f %f %f %f %f\n', a[0], a[1], a[2], a[3], a[4]);
return 0;
}
是否有可能让C语言像这样读取numpy数组,还是这种方法从根本上存在缺陷?是否有更好的方法可以实现?如果这种方法可行,是否可以使用Ctype布尔型来协调进程的工作和等待?例如,当Python初始化numpy数组时,将该值设置为1,C语言则在while(sp_bool==1)循环中等待。然后当Python完成操作并将该值更改为0时,C语言开始执行,最后在完成操作时将该值再次更改为1。