Если IronPython не интересует, то потенциально есть три способа.
1. Можно вызывать python.dll и управлять состоянием интерпретатора
дёргая определённые функции. Это не самый простой способ и почти наверняка потребует собственной сборки пайтона, однако имеет некоторые преимущества. Одно из них - наивысшая скорость, так как всё происходит в одном пространстве имён. И полноценный контроль интерпретатора, только разобраться в реализации. Однако есть множество проблем, которые придётся решить: GIL, контроль состояния, входные данные и сбор результатов вычислений.
2. Можно
вызывать python.exe и передавать состояние косвенно (stdout/stdin, socket,
shared memory), перебрасывая объекты через примитивы, например,
этим. Однако, из сложностей, придётся написать горстку кода на python и быть готовым к ограничениям. Здесь также и упомянутые
longclaps микросервисы.
Но если IronPython вызывает интерес, то можно на .NET реализовать всё необходимое, или же
использовать готовое. На самом деле, здесь даже немного приветливее смотрится тот же F#, да и вообще платформа у мелкомягких во многом поразительна.