Как выставить пакет Python для C#, используя python. Net против ZeroMQ или другого - PullRequest
1 голос
/ 18 января 2020

Я занимаюсь разработкой приложения, написанного на Python3 и состоящего из библиотеки / пакета Python (которая содержит основные функции) и приложения Python, которое будет обеспечивать оболочку cli и обрабатывать пользовательские команды.

Кроме того, функциональность, содержащаяся в пакете Python, должна быть доступна для существующих gui приложений, написанных на C# (с использованием Microsoft. Net framework).

I ' Мы провели немало исследований о том, как это можно сделать, и придумали несколько потенциальных решений.

  1. Используйте Python. Net для реализации * Скрипт 1035 * в приложении C#, который импортирует мой пакет python и вызывает нужные методы / атрибуты. Я пока не смог заставить его работать на monodevelop, но это, кажется, популярный вариант, несмотря на то, что не так много документации относительно моего варианта использования.
  2. Внедрить мою библиотеку Python как DLL с использованием CFFI . Похоже, что эта опция не потребует много работы, но трудно понять, как я буду поддерживать свои интерфейсы / что я выставляю кому-то, кто использует DLL в C#. Похоже, что эта опция не поддерживается многими документами, относящимися к моему сценарию использования.
  3. Создайте небольшое приложение Python, которое импортирует мой пакет python и предоставляет его функциональность через ZeroMQ. или gPP C. Это кажется наиболее гибким вариантом с достаточным количеством документации, однако меня беспокоит задержка, поскольку в конечном итоге этот инструмент используется для управления оборудованием.

Примечание. Я не очень хорошо разбираюсь в C# и буду делать большая часть разработки в linux.

Я действительно хочу узнать, какой вариант обеспечит наилучший баланс между чистым интерфейсом моей библиотеки и низкой задержкой / хорошей производительностью (акцент на ).

Ответы [ 2 ]

1 голос
/ 20 января 2020

Цель : задержка до ~ 10 [ms] для стабильности SuT?

Спасибо за добавленные сведения о довольно широком диапазоне потолочные задержки ~ 10 .. 100 [ms]
+

… на самом деле это , заменяющее чем-то, что ранее было реализовано в C. Идея состоит в том, что если интерфейсный слой библиотеки и cli реализованы в Python, пользователям будет проще *1027* собрать из основные функции для их вариант использования . Некоторые из более сложных циклов управления могут быть реализованы как библиотека stati c C или библиотека ржавчины, которую мы будем вызывать с помощью python. В любом случае верхний слой все еще реализован в Python, который должен будет взаимодействовать с C#
( = наиболее важный отсюда
Необходимость понимания обоих
Затраты желаемого простоты пользовательских расширений и рефакторинга архитектуры
+
Кто платит эти Расходы
)


Прежде чем мы даже начнем поиск Решение :

Для того, чтобы это было сделано безопасно и профессионально, вам, скорее всего, понравится this , чтобы не повторять типичные ошибки неосведомленных решений, где общие замечания исходят из кучи непосредственного опыта с обработкой система с контролем-l oop под ~ 80 [us]

Карта вашей системы управления - как внутренняя экосистема (ресурсы) & экзосистема (взаимодействие с внешним миром)

enter image description here

* 1 084 * Далее следует архитектура:

Без должного понимания игрушек никто не может определиться с «Достаточно правильной архитектурой».

Понимание структуры устройств с задержкой устройство требует, чтобы мы сначала знали (читай + тестируйте + эталон, а также конверт (ы) дрожания / блуждания при (перегруженных) условиях S ystem- ) u nder- T est). Не зная, что это приведет только к слепому и неподтвержденному факту убеждению, наш SuT никогда не ударится в стену реальности , которая докажет себя неправильно, как правило, в наименее приятные моменты.

Необратимо неправильная и плохая практика, поскольку все накопленные до сих пор затраты уже сожжены ...

Знание и тестирование - это ключевой шаг до создания эскиза архитектуры - где важны детали ( ref. Сколько человек теряет в h2d/d2h латентности [us]? - почему эти основные расходы так слабо отражены? Значит ли это, что эти расходы не существуют? Нет. Они делают существуют, и ваши контрольные циклы будут платить им каждый раз ... так что лучше знать обо всех таких скрытых затратах, оплаченных в TimeDOMAIN, задолго до ... до архитектуры проектируется и разрабатывается.)


Не стесняйтесь go Распределено (где разумно поддерживается ) :

Learn от НАСА Аполлон Миссио n design
- он был глубоко распределен
и
- правильная инженерия помогла достичь Луны
- он спас как Национальную гордость, так и жизни этих первых и пока единственных, внеземных жителей Земли
( кредиты Мисс Маргарет ХАМИЛЬТОН *1136* мудрость в определении ее правил проектирования и ее изменения в умах правильной инженерии многих элементов управления стратегии координации петлевых систем )

Либо ZeroMQ (zmq, представляющая собой зрелую, компонуемую, хорошо масштабируемую архитектуру принципиально распределенного поведения «многие ко многим» , разработанного поверх набор из нескольких простых масштабируемых формальных шаблонов форм общения) или его младшая и легковесная сестра Marting SUSTRIK, nanomsg, может очень помочь в создании умной макросистемы, где Сильные стороны отдельных компонентов (или монополии, не имеющие замены) могут быть соединены в стабильные, учитывающие приоритеты макросистемы все еще в пределах задержки *1153*, для которых в принципе нельзя (или не нужно) чтобы, по ряду других причин - экономия затрат, время выхода на рынок, первыми из них были юридические ограничения) разработать монолитную c систему «все в одном» .

Хотя на первый взгляд это может показаться усложняющим проблему, вскоре можно понять, что оно служит совершенно противоположному:

  • не сжигает топливо (да, деньги инвесторов) на еще одном изобретении колеса (s…)
  • с использованием проверенных в отрасли инструментов чаще всего повышает надежность , конечно, если использовать их правильно…
  • масштабирование производительности может быть хорошим побочным эффектом, а не pani c слишком поздно перефакторировать кошмар

не говоря уже о положительных преимуществах независимой эволюции таких инструментов и их дальнейшем расширении.

Моя система столкнулась с подобной дилеммой - # C я ни на секунду не могу (зависимость приложения с закрытым исходным кодом была слишком дорогой, если не фатальной для нашего успеха).

  • CLI: называется remote-keyboard был точным примером разделения первого python, где remote можно было прочитать как trans-atlanti c -keyboard
  • ML: был наименьшим элементом задержки в городе, поэтому необходимо было использовать слияние
  • core- Приложение: * 1 200 * была расширена с использованием стандартной отраслевой библиотеки DLL в систему , не сообщая об этом (в этом случае оставались только удаленные core-logi c. все остальное было распределено, чтобы минимизировать задержки всех циклов управления и позволить обрабатывать различные уровни приоритетов)
  • неблокирующие надстройки : были отключены загружено из core-App
  • core-App- (1 + N) -Hot-Standby -Shading: введено в изначально монолитную c C / S экзосистему

Есть ли необходимость добавлять больше для того, чтобы идти скорее Распределенным и независимым от первоначальной блокировки поставщиков?

Выбрав, кроме пота, слез и крови - начать с ZeroMQ в дни его зрелости v2.x, Я не жалею ни одного часа, что сделал это , и не могу себе представить, чтобы выполнить все вышеперечисленное, не сделав этого.

0 голосов
/ 19 января 2020

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

Вам нужно будет предоставить функциональность python через аргументы командной строки (что вы, возможно, уже делаете в любом случае), и ваше приложение python должно будет иметь возможность возвращать результаты в виде json данных, которые будут вероятно, это самый простой способ получить его из C#.

Все зависит от того, насколько сложным должно быть взаимодействие между вашим C# gui и приложением python.

...