Flowthru.Extensions.Python
0.26.0-preview.112
dotnet add package Flowthru.Extensions.Python --version 0.26.0-preview.112
NuGet\Install-Package Flowthru.Extensions.Python -Version 0.26.0-preview.112
<PackageReference Include="Flowthru.Extensions.Python" Version="0.26.0-preview.112" />
<PackageVersion Include="Flowthru.Extensions.Python" Version="0.26.0-preview.112" />
<PackageReference Include="Flowthru.Extensions.Python" />
paket add Flowthru.Extensions.Python --version 0.26.0-preview.112
#r "nuget: Flowthru.Extensions.Python, 0.26.0-preview.112"
#:package Flowthru.Extensions.Python@0.26.0-preview.112
#addin nuget:?package=Flowthru.Extensions.Python&version=0.26.0-preview.112&prerelease
#tool nuget:?package=Flowthru.Extensions.Python&version=0.26.0-preview.112&prerelease
Flowthru.Extensions.Python
Run Python functions as Steps inside a Flowthru Flow. A @step-decorated function in a .py
module becomes a first-class Step in the DAG — wired between typed Catalog Items, validated at
pre-flight, and cached like any C# Step. Rows cross the C#/Python boundary as Apache Arrow, so
a Step that hands IEnumerable<TSchema> to Python receives a pandas.DataFrame and returns
one, with no glue code in between.
Mental model
A Flowthru Step is a typed transform from input Items to output Items. This package lets that
transform live in Python instead of C# — the Flow doesn't care which side a Step runs on. Bring
your data-science mental model: a function that takes one or more DataFrames and returns one,
decorated so Flowthru knows its input and output schemas. The engine owns scheduling, type
contracts, and caching; you own the pandas/scikit-learn/numpy body. Python Steps run
through a single subprocess worker, so the scheduler serializes them — fan-out parallelism is a
C#-side property, not a Python one.
Install
dotnet add package Flowthru.Extensions.Python
Register Python support, then add a Python Step that points at a module and function:
services.AddFlowthru(flowthru =>
{
flowthru.RegisterCatalog(sp => new Catalog(basePath, sp.GetRequiredService<IConfiguration>()));
flowthru.UsePython(python =>
{
python.ModuleSearchPaths.Add(basePath);
python.VenvPath = venvPath;
});
flowthru
.RegisterFlow<Catalog, IPythonExecutor>("DataProcessing", DataProcessingFlow.Create)
.WithDescription("Preprocesses companies and shuttles using Python");
});
public static BuiltFlow Create(Catalog catalog, IPythonExecutor executor) =>
FlowBuilder.CreateFlow("DataProcessing", pipeline =>
{
pipeline.AddPythonStep(
label: "PreprocessCompanies",
module: "Flows.DataProcessing.Steps.preprocess_companies",
function: "preprocess_companies",
input: catalog.Companies,
output: catalog.PreprocessedCompanies,
executor: executor
);
});
The Python side declares its schemas on the decorator:
import pandas as pd
from flowthru import step
@step(inputs=["CompanySchema"], outputs=["PreprocessedCompanySchema"], cacheable=True)
def preprocess_companies(companies: pd.DataFrame) -> pd.DataFrame:
companies["iata_approved"] = companies["iata_approved"] == "t"
return companies
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Apache.Arrow (>= 23.0.0)
- Flowthru.Core (>= 0.26.0-preview.112)
- Microsoft.Extensions.Configuration (>= 10.0.4)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.4)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.4)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.4)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.4)
- Microsoft.Extensions.Options (>= 10.0.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.26.0-preview.112 | 33 | 6/5/2026 |
| 0.25.0 | 76 | 6/2/2026 |
| 0.25.0-preview.110 | 40 | 6/2/2026 |
| 0.24.0-preview.108 | 37 | 6/2/2026 |
| 0.21.0 | 96 | 5/24/2026 |
| 0.21.0-preview.101 | 54 | 5/24/2026 |
| 0.20.0 | 98 | 5/23/2026 |
| 0.20.0-preview.100 | 50 | 5/23/2026 |
| 0.19.0-preview.99 | 53 | 5/23/2026 |
| 0.18.5-preview.98 | 52 | 5/22/2026 |
| 0.18.4-preview.97 | 47 | 5/22/2026 |
| 0.18.3 | 102 | 5/20/2026 |
| 0.18.3-preview.95 | 55 | 5/19/2026 |
| 0.18.2 | 98 | 5/18/2026 |
| 0.18.2-preview.93 | 52 | 5/18/2026 |
| 0.18.1 | 97 | 5/15/2026 |
| 0.18.1-preview.92 | 46 | 5/14/2026 |
| 0.18.0-preview.91 | 45 | 5/14/2026 |
| 0.17.5 | 100 | 5/13/2026 |