首页 > 编程语言 >C#使用Python.NET执行Python脚本文件踩坑总结

C#使用Python.NET执行Python脚本文件踩坑总结

时间:2024-12-25 19:53:41浏览次数:9  
标签:workDir Python py C# NET 执行 PythonEngine

  • 在VS,Nuget包管理器搜索“Python.NET”,安装pythonnet包,如下图:
  • C#使用Python.NET执行Python脚本文件,C#代码如下:
     1 public class PythonExecuter
     2 {
     3     private readonly string _pythonDllPath;
     4     private readonly string _workDir;
     5 
     6     public PythonExecuter(string dllPath, string workDir)
     7     {
     8         _pythonDllPath = dllPath;
     9         _workDir = workDir;
    10     }
    11 
    12     public async Task<bool> ExecutePythonScript(string scriptName)
    13     {
    14         bool result = false;
    15         Runtime.PythonDLL = _pythonDllPath;
    16         PythonEngine.Initialize();
    17         dynamic sys = Py.Import("sys");
    18         sys.path.append(_workDir);
    19         PythonEngine.BeginAllowThreads();
    20         await Task.Run(() =>
    21         {
    22             try
    23             {
    24                 using (Py.GIL())
    25                 {
    26                     Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} python脚本准备执行");
    27                     dynamic testModule = Py.Import(scriptName);// 导入模块(传入py文件名即可)
    28                     dynamic py = testModule.main();// 执行该py脚本的main函数
    29                     Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} 执行python脚本成功,返回值:{py}");
    30                     result = (int)py == 0;
    31                 }
    32             }
    33             catch (Exception ex)
    34             {
    35                 Console.WriteLine(ex.ToString());
    36             }
    37         });
    38         // 使用AppContext设置开关来临时启用BinaryFormatter
    39         AppContext.SetSwitch("System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization", true);
    40         PythonEngine.Shutdown();
    41         AppContext.SetSwitch("System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization", false);
    42 
    43         return result;
    44     }
    45 }
  • 我的Python代码如下(有一个main函数,main函数调用了test函数):
  • 调用和执行结果如下:
  • 1 PythonExecuter executer = new(@"D:\Python\python313.dll", @"C:\Users\megarobo\PycharmProjects\pythonProject");
    2 bool result = await executer.ExecutePythonScript("pylabrobot");
    3 Console.ReadKey();
  • 执行结果包括Python脚本执行的打印输出内容。
  • 踩坑点说明:
  1. 确保在代码中设置了Runtime.PythonDLL属性,指向正确的Python DLL文件。例如,如果你的Python版本是3.8,那么DLL文件名通常是python38.dll(Windows,Python安装根目录下);
  2. 设置工作目录,如果你的Python脚本.py文件在指定“_workDir”目录下(这样你的.py文件才能作为模块被导入),需要调用如下代码:
    1 dynamic sys = Py.Import("sys");
    2 sys.path.append(_workDir);
  3. using (Py.GIL())代码块的作用:在 Python.NET中,Py.GIL() 用于确保在当前线程中执行Python代码时,GIL被持有,这样可以安全地调用Python代码而不会破坏Python对象的状态。using语句确保在代码块执行完毕后,GIL会被正确释放;
  4. 如果你想在C#多线程中,使用Python对象(如上图我在Task.Run()中运行),需要调用PythonEngine.BeginAllowThreads(),否则无法达到预期效果;
  5. PythonEngine初始化后,执行完Python脚本后,需要释放资源。但直接调用PythonEngine.Shutdown(),会报错:BinaryFormatter serialization and deserialization are disabled within this application。这是因为 .NET 5 及更高版本出于安全考虑默认禁用了 BinaryFormatter。Python.NET 在执行 PythonEngine.Shutdown() 时依赖于BinaryFormatter。所以我们可以使用AppContext设置开关来临时启用BinaryFormatter。

标签:workDir,Python,py,C#,NET,执行,PythonEngine
From: https://www.cnblogs.com/gnix-a/p/18631116

相关文章

  • Powercat 无文件落地执行技巧,你确定不进来看看?
    声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。目录完整示例注意事项演示无文件落地执行(filelessexecution)是一种技术,用于避免在磁盘上留下文件痕迹,使得恶意行为更难被检测到。Pow......
  • windows 下面使用 celery 管理定时任务
    Python实现定时任务有以下几种思路使用子进程(现成)+time.sleep间隔执行使用现有的库管理定时任务如,celery,tornado等使用系统的机制执行linux下面crontab,windows下面taskschd.msc本次调查celery这个常用的异步任务管理框架,它有一下好处支持分布式支持任务确认,即......
  • Docker之运行流程
    Docker的运行流程1、当用户发送一个操作指令首先它会先到达docker_host下docker_host代表docker的主机。2、docker主机下有dockerdaemon的进程,它会接收指令并去执行。3、dockerdaemon管理容器和本地仓库,当他收到run命令时,它会先检查本地仓库是否存在这个镜像。4、如果镜像......
  • Remember smile is the best medicine to cure your illness
    『在太阳西斜的这个世界里』—BrokenChronograph—『置身天上之森』—LateAutumnNight′sDream—『等这场战争结束之后』—StarryRoadToTomorrow—『不归之人与望眼欲穿的人们』—DiceInPot—『人人本着正义之名』—FromDownTillDusk—『长存不灭的过去,逐渐......
  • COMP2046 POSIX API
    COMP2046CourseworkAutumn2024Weight:20%modulemarksDeadline:27thDecember2024,5pmBeijingtimeSubmission:CreateasinglescyXXX.zip(Studentaccount)filecontainingyoursourcecodefilesandfilesprovidedalongwiththiscoursework.Wewillne......
  • Goby 漏洞发布|CVE-2024-9047 WordPress File Upload 插件 wfu_file_downloader.php 任
    漏洞名称:CVE-2024-9047WordPressFileUpload插件wfu_file_downloader.php任意文件读取漏洞EnglishName:CVE-2024-9047WordPressFileUploadPluginwfu_file_downloader.phpArbitraryFileReadVulnerabilitCVSScore:6.8漏洞描述:WordPressFileUpload插件是一款Wo......
  • 为什么 Llama 3.3 70B 比 GPT-4o 和 Claude 3.5 Sonnet 更优秀
    过去七天的AI新闻如狂风暴雨般涌来,AI世界发生了许多重大变化。在这篇文章中,我们将深入探讨来自Llama3.370B、GPT-4o和Claude3.5Sonnet等主要参与者的最新AI动态。12月7日,Meta将发布其年度最后一个AI模型。而就在昨天(12月6日),Meta发布了拥有700亿参数的......
  • zshrc中的(eval) 前缀是什么?
    在我的配置文件中有这样几行配置:#python-click<8.0eval"$(_PYMOBILEDEVICE3_COMPLETE=source_zshpymobiledevice3)"#python-click>=8.0eval"$(_PYMOBILEDEVICE3_COMPLETE=zsh_sourcepymobiledevice3)"这几行配置的作用是在 Zsh中使用pymobiledevice3命令的参数......
  • 安装Apache的常见报错并给出解决方案
    文章目录一、httpd-kinstall-nApache输入后,提示拒绝访问怎么办解决方案二、命令行输入:httpd-t报错解决方案三、httpd-kinstall-nApache输入后,另外一种报错解决方案测试是否成功四、路径问题引起报错解决方案一、httpd-kinstall-nApache输入后,提示......
  • Python项目依赖管理
    做好Python环境的包版本管理对于确保项目的稳定性、可重复性和可维护性至关重要。以下是我平时采取的一些方法,期望对读者有所帮助:1.使用虚拟环境虚拟环境是实现包版本管理的重要基础,它可以隔离不同项目的运行环境,避免包版本冲突。我平时主要使用conda来管理虚拟环境。先在测试......