dotnetpy: Python interop, reimagined for modern .NET โœจ

// .NET โ†” Python in 4 lines
var executor = Python.GetInstance();
var temperatures = new[] { 23.5, 19.2, 31.8, 27.4, 22.1 };
using var result = executor.ExecuteAndCapture(@"
    import statistics
    result = {'mean': statistics.mean(data), 'stdev': statistics.stdev(data)}
", new Dictionary<string, object?> { { "data", temperatures } });
Console.WriteLine($"Mean: {result?.GetDouble("mean"):F1}ยฐC ยฑ {result?.GetDouble("stdev"):F1}");

์š”์ฆˆ์Œ์€ ์›ํ•˜๋“  ์›์น˜ ์•Š๋“ , ์–ด๋–ค ๋„๋ฉ”์ธ์ด๋‚˜ ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์“ฐ๋˜ ๊ฐ„์— Python๊ณผ์˜ ํŽ˜์–ด๋ง์ด ์–ด์ƒ‰ํ•˜์ง€ ์•Š์€ ์‹œ๋Œ€์ž…๋‹ˆ๋‹ค. ๋จธ์‹  ๋Ÿฌ๋‹๊ณผ LLM์ด ๋Œ€์ค‘ํ™”๋จ์— ๋”ฐ๋ผ ๋”์šฑ ๋ช…ํ™•ํ•ด์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :smiley:

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์ด Python๊ณผ์˜ ํŽ˜์–ด๋ง๊ณผ ์ฝœ๋ผ๋ณด์— ๋Œ€ํ•ด ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค๋งŒ, .NET์˜ ๊ฒฝ์šฐ์—๋Š” ์œ ๋… ๊ทธ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋ณด๋‹ˆ ์•„์‰ฌ์šด์ ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

Pythonnet์€ ์–‘๋ฐฉํ–ฅ (C# โ†’ Python ๋ฐ Python โ†’ C#) ์ƒํ˜ธ ์šด์šฉ์„ฑ์—๋Š” ์ถฉ๋ถ„ํžˆ ๊ฒ€์ฆ๋˜๊ณ  ์ข‹์€ ๊ธฐ์ˆ ์ž„์ด ํ‹€๋ฆผ์—†์ง€๋งŒ, Deprecated ๋œ .NET Framework ์‹œ์ ˆ์˜ Serialization์— ๊ธฐ๋Œ€๊ฑฐ๋‚˜, GIL์„ ํ˜ธ์ถœ์ž ์ชฝ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ์–ดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถˆํŽธํ•œ ์ , ๊ทธ๋ฆฌ๊ณ  ๋ฆฌํ”Œ๋ ‰์…˜์— ๋งŽ์ด ์˜์กดํ•˜๋‹ค๋ณด๋‹ˆ ์ตœ๊ทผ .NET ์—์ฝ”์‹œ์Šคํ…œ์—์„œ ๊ฐ•์กฐ๋˜๋Š” AOT ์ง€์›์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ๋šœ๋ ทํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ ์ตœ์‹  ์Šคํƒ์ธ uv ๊ฐ™์€ ๋„๊ตฌ์™€๋„ ์นœ๋ฐ€์„ฑ์„ ๋†’์—ฌ์„œ Python์„ .NET์˜ First Citizen์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์•ฝ 2~3๊ฐœ์›”๊ฐ„ ๊ณ ๋ฏผํ•˜๋ฉฐ ์ž‘์—…ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ์˜ค๋Š˜ 0.5.0 ๋ฒ„์ „์œผ๋กœ nuget ํŒจํ‚ค์ง€๋กœ ์ฒ˜์Œ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

dotnetpy๋Š” Python DLL์ด ๋“œ๋Ÿฌ๋‚ด๋Š” C API๋ฅผ ์ง์ ‘ P/Invoke๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  Python ์ธก์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ JSON serialization์„ ํ†ตํ•ด์„œ ํšŒ์ˆ˜ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ, AOT์— ๋Œ€์‘๋  ์ˆ˜ ์žˆ๋„๋ก JSON serialization์€ ๋ฆฌํ”Œ๋ ‰์…˜ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ JsonReader/JsonWriter ๊ธฐ๋ฐ˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.

์ด Buildersโ€™ Log์—๋Š” ์•ž์œผ๋กœ 1.0 ๋ฆด๋ฆฌ์Šค์— ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์ง€์†์ ์œผ๋กœ ๊ธฐ๋กํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์ด ์‚ฌ์šฉํ•ด๋ณด์‹œ๊ณ  ๋งŽ์€ ์˜๊ฒฌ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! :person_bowing:

6 Likes