Можно ли в приложении С# (.NET Windows forms) вызвать форму на Питоне
У меня есть приложение С# (.NET Windows forms), которое представляет собой меню, каждая кнопка которого, вызывает на главный экран отдельную форму, для решения конкретных задач.
Теперь, мне понадобилось добавить в существующей проект форму, которая поддерживает язык Питон и его библиотеки (конкретно PyTorch, которая не поддерживает С#). Форма должна вызывается по кнопке.
Можно ли это физически реализовать, и если можно то, как? Либо же необходимо написать отдельное приложение Питон, и неким образом инициировать его запуск из основного приложения? Буду рад любой информации по теме.
Ответы (1 шт):
В рамках вашего питон-проекта напишите и питон-форму. Т.е. у вас есть набор из питон-библиотек, и напишите форму для этого. Затем создайте экзешник с этой формой. Вроде бы питон и его расширения это позволяют.
А далее по кнопке из приложения на дот.нете - создавайте процесс. Этот процесс - это и есть экзешник питона, а экзешник питона - это форма на питоне. Т.е. из под дот.нета вы будете вызывать сторонний процесс, и это не сложно.
Но тут может быть проблемой то, что у вас появятся два процесса, т.е. один процесс - это главный дот.нет процесс, и есть ещё один - это экзешник питон-процесса. Но проблема в том, что эти процессы должны обмениваться данными между собой. Используйте разделяемую память, но это сложно. Используйте результаты исполнения питон-формы (питон-процесса) в виде файла, т.е. кидайте нужные результаты исполнения питон-процесса в файл(ы). И мониторьте из дот.нета изменения в этих файлах, и как только изменения есть - читайте эти файлы - вы получите результат исполнения питон-процесса.
Это всё может показаться сложным. Но это не так. Любые другие варианты межпроцессового взаимодействия (тем более между разными исполняющими средами) - будут ещё сложнее, чем описанный здесь. Т.е. это самый простой вариант.
И да, что бы ускорить межпроцессовое взаимодействие (а оно файловое), разверните рам-диск (ram-drive) нужного размера, и туда складывайте результаты исполнения питон-процесса. Тогда результаты будут не на диске, а в оперативной памяти.
Почему оно в принципе хорошо работает? Потому что у вас две разных исполняющих среды, и смешивать их не нужно. Т.е. смешивать данными - можно, но смешивать кодом - не нужно. Т.е. как либо динамически пристёгивать "левое" непонятно как работающее - это может стать потенциальной проблемой. Именно потому и стоит запускать "левый" код как отдельный процесс. Т.е. если он завалится - то он не завалит ваш главный процесс, и вы не потеряете все данные. А этот опасный (завалившийся) процесс можно перезапустить. И если подходить к этому с умом, то можно ещё и отловить то - а на каких данных этот опасный процесс заваливается, и это тоже в общем то не сложно.