Создать файл общих параметров для C и Python - PullRequest
0 голосов
/ 25 марта 2019

Мне нужно создать файл параметров, которым можно управлять через Python 3.7 и базу кода C.Этот файл должен быть изменен либо программой C, либо программой Python, чтобы изменения вступили в силу для другого программного обеспечения (функция обновления будет обрабатывать чтение обновленного файла).Лучше всего, если файл не предназначен для чтения человеком, так как он содержит информацию, которую лучше оставить запутанной.

** Есть ли рекомендуемый способ сделать это?**

Я мог бы создать отдельные файлы Python и C, но набор параметров будет меняться со временем (для обслуживания кода), и значения будут изменяться этими программами.Список также будет очень длинным.Было бы сложно поддерживать два разных файла и обновлять их с течением времени.Кроме того, файл может нуждаться в обмене между пользователями, так что версия, измененная программным обеспечением, управляемым пользователем 1, должна быть читаемой программным обеспечением, запускаемым пользователем 2.Идея состоит в том, что другие части обоих кодов могут получать доступ к частям списка параметров, не зная полного содержимого списка.

Чтобы пояснить пример, я мог бы получить файл parameter.h, содержащий:

struct {
  double par1 =1.1;
  int par 2   =2;
} par_list

И я мог бы иметь parameter.py с:

class par_list:
    def(__self__):
        self.par1 = double(1.1)
        self.par2 = int(2)

Затем, выполнив импорт в Python или включение в C, я мог бы инициализировать список параметров.Но в этом случае параметры читаются в разных файлах.

Я рассматриваю вопрос об использовании какого-либо двоичного файла для хранения значений и создания сценария, который пишет код Python и C, который считывает и обновляет значения.Я обеспокоен тем, что двоичный файл должен быть взаимозаменяемым между архитектурой ARM под управлением Linux и архитектурой x86 под управлением Windows.

1 Ответ

0 голосов
/ 09 мая 2019

Вот пример работы с numpy:

код C:

#include <stdio.h>
#include <stdint.h>

struct Struct_format{
    uint8_t the_unsigned_int8;
    int32_t the_signed_int32[2];
    double the_double;
};

typedef struct Struct_format upperStruct;

//Use separate file to define default value:

void printStruct(upperStruct test_struct){
    printf("test_struct.the_unsigned_int8 = %d\n", test_struct.the_unsigned_int8);
    printf("test_struct.the_signed_int32[0]  = %d\n", test_struct.the_signed_int32[0]);
    printf("test_struct.the_signed_int32[1]  = %d\n", test_struct.the_signed_int32[1]);
    printf("test_struct.the_double        = %f\n", test_struct.the_double);
}

void main(){
    //Define a "default" value:
    upperStruct fromC2Python = {4U,{-3,-1},2.1};

    printf("Printing fromC2Python\n");
    printStruct(fromC2Python);

    //Save this default in a file:
    FILE * fid = fopen("fromC2Python.bin","w");
    fwrite((void *)&fromC2Python, sizeof(fromC2Python) ,1, fid);
    fclose(fid);

    //Now load the file created by Python:
    upperStruct fromPython2C;
    FILE * fid_py = fopen("fromPython2C.bin","r");
    fread(&fromPython2C, sizeof(fromPython2C) ,1, fid_py);
    fclose(fid_py);

    printf("Printing fromPython2C\n");
    printStruct(fromPython2C);

}

Код Python:

import numpy


datatype = numpy.dtype([('potato',
                                  [('time', numpy.uint8),
                                   ('sec', numpy.int32, 2)]),
                        ('temp', numpy.float64)],
                       align=True)
fromPython2C = numpy.array([((5, (-6, -7)), 61.55)], dtype=datatype)

print(fromPython2C)

fromPython2C.tofile("fromPython2C.bin", sep="")

fromC2Python = numpy.fromfile("fromC2Python.bin", dtype=datatype, count=-1, sep="")

print(fromC2Python)
print(fromC2Python['potato'])
print(fromC2Python['potato']['time'])
print(fromC2Python['temp'])

Идея состоит в том, что numpy позволяет читать и записывать в структурированные двоичные файлы. Следовательно, достаточно создать спецификацию dtype с анализатором текста.

...