Общая переменная env между c , python и bash

#python #c #bash #environment-variables #shared-libraries

Вопрос:

У меня есть приложение, состоящее из разных слоев и написанное на трех разных языках: c , bash и python РЕДАКТИРОВАНИЕ: на платформе Linux/Raspbian

С тех пор мы управляем разными сборками, в зависимости от платформы, с разными ветвями разработки sw, но я пытаюсь объединить все в одной ветви, чтобы повысить удобство обслуживания.

Знаете ли вы, существует ли (и какой из них лучше) способ обмена настройками env между c , bash и python?

Смысл в том, чтобы различать, создаю ли я платформу A или платформу B, и единственная идея, которая у меня есть, — это создать отдельный файл для каждого языка для настройки. Есть ли способ иметь единую точку зрения на информацию?

Комментарии:

1. Обычно это входило бы в CMake или что-то подобное. Вам действительно нужно знать, для какой платформы вы создаете на C ? Если вы укажете разные пути включения и т. Д. В зависимости от цели, в любом коде не должно быть видно, что существуют разные платформы.

2. спасибо за asnwer, у меня другой код в файле cpp

3. и дело в том, чтобы иметь уникальную точку, где cpp, bash и python получают доступ к информации о платформе

4. Я предполагаю, что очень мало кода C должно отличаться между Linux и Raspbian? Вы изолировали эти части? Надеюсь, ваша кодовая база не завалена #ifdef буквами s

5. на самом деле код raspbian, но у меня другое поведение, чтобы включить его в соответствии с HW, прикрепленным к Rpi.. и, к сожалению, у меня разреженный код на трех языках, которые я упомянул.

Ответ №1:

В зависимости от платформы объявление переменной среды будет отличаться. Для Linux вы, возможно, захотите использовать:

 #include lt;stdlib.hgt;  int setenv(const char *envname, const char *envval, int overwrite);  

Но вам придется различать платформы. Другой способ-иметь файл конфигурации с блокировкой для совместного использования этих переменных, но это также зависит от платформы (механизм блокировки файлов).

Решение, не зависящее от платформы, должно иметь некоторую форму связи между различными программами (IPC).

Комментарии:

1. платформа-linux, извините, что я изменяю, чтобы прояснить этот момент

Ответ №2:

Это не полное решение для этой смешанной среды, а скорее идея о том, как организовать ее часть на C . Возможно, эту структуру можно было бы использовать повторно, чтобы сделать что-то подобное для bash и python тоже.

Я вижу структуру каталогов, которая может выглядеть примерно так, как показано ниже. src и include будет содержать все независимые от платформы части. Для деталей, специфичных для платформы, вы создаете подкаталог в targets :

 src/ include/ targets/   -- linux/  | |  |  -- src/  | include/  |   -- raspbian  |   -- src/  include/  

В include него вы можете поместить заголовок прокси — сервера и описание интерфейса для конкретных частей платформы.

include/IFoo.hpp

 #pragma once  class IFooable { public:  virtual ~IFooable() = default;  virtual void do_stuff() = 0; };  

include/foo.hpp

 #pragma once  #include lt;foo_impl.hppgt;  

И в целевых каталогах:

raspbian/include/foo.impl.hpp

 #pragma once #include lt;IFoo.hppgt;  class foo : public IFooable {  void do_stuff() override; };  

linux/include/foo.impl.hpp

 #pragma once #include lt;IFoo.hppgt;  class foo : public IFooable {  void do_stuff() override; };  

Обе IFooable реализации совершенно не знают друг о друге, но они реализуют один и тот же интерфейс, который вы будете использовать в остальной части агностического кода платформы.

Затем вам нужно только заставить систему сборки решить, какую реализацию выбрать. Простое Makefile может выглядеть так:

 raspbian:  $(CXX) -Iinclude -Itargets/raspbian/include ...  linux:  $(CXX) -Iinclude -Itargets/linux/include ...  

Ключевая часть состоит в том, чтобы определить, когда вам нужно делать что-то по-разному на разных платформах. Когда вы чувствуете желание #ifdef #else #endif что-то, это должно автоматически заставить вас остановиться и задаться вопросом, является ли это чем-то тривиальным (например, однострочным) или реализации действительно разные звери. Если вы придете к выводу, что это нетривиальная разница, подумайте о том, какой общий интерфейс вы хотели бы иметь, и определите класс интерфейса для этого. Затем продолжайте и реализуйте два разных решения. В части кода, не зависящей от платформы, он будет чистым. Не будет видно и следа разницы между реализациями linux и raspbian.