Я только что начал C и пытаюсь сделать бэкэндом для своего питона. На данный момент у меня есть громоздкая система записи огромных входных файлов (по крайней мере 10^6 поплавков) из python, а затем инициализация C (которая также должна загружаться множеством других данных), запускающих C до завершения, получая свой вывод только для повторной инициализации его с помощью нового массива ввода.Numpy массивы в C
Я не уверен, если это концептуально возможно оглядеться, но я надеялся просто направить C на адрес памяти для массива numpy и использовать его, как если бы это массив, созданный C Задача состоит в том, чтобы python инициализировал C, построил свой первый массив, запустил C-код, пока он не будет готов для следующего массива, который затем будет сгенерирован python.
Это какой-то фиктивный код, который я написал, чтобы попытаться получить C для чтения массивов numpy. На данный момент у C есть ошибка сегментации, и я не уверен, что из-за того, что я плохо на C, мне не нравится читать массивы numpy или немного того и другого.
Front.py
array_interface был из here.
#! /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 bool, чтобы оба процесса знали адрес, чтобы координировать, какой процесс работает и который ждет? например python устанавливает значение в 1, поскольку он инициализирует массив numpy - C ждет ожидания за какое-то время (sp_bool == 1). Затем, когда python завершен, он меняет значение на 0, а C выполняет, наконец, меняя значение на 1, когда оно заканчивается.
Я не знаю, что такое Python, чтобы узнать, есть ли способ, но есть один, это будет непроцессорное решение, а не внеочередное решение, как то, что вы сейчас делаете. Не удается ли Python вызвать код C из файлов '.so'? – Medinoc
Кстати, даже если это может сработать, вы не используете sscanf() правильно: он возвращает количество проанализированных значений, а не само значение. – Medinoc
Вы можете встроить Python в свое приложение C (http://docs.python.org/3/c-api/intro.html#embedding-python). –