// .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์ด ๋์คํ๋จ์ ๋ฐ๋ผ ๋์ฑ ๋ช
ํํด์ง ๊ฒ ๊ฐ์ต๋๋ค. ![]()
๊ทธ๋ฌ๋ค๋ณด๋ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค์ด 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 ๋ฆด๋ฆฌ์ค์ ๋๋ฌํ๊ธฐ๊น์ง์ ๊ณผ์ ์ ์ง์์ ์ผ๋ก ๊ธฐ๋กํด๋ณด๋ ค ํฉ๋๋ค. ๋ง์ด ์ฌ์ฉํด๋ณด์๊ณ ๋ง์ ์๊ฒฌ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค! ![]()