WPF+Pythonnet中遇到的坑

记录使用Pythonnet遇到的坑

最近在做上位机的内容,使用 .Net 6.0 的 WPF 进行开发,因为之前是做Python的,写了不少有用的脚本,寻思着把之前的一些Python脚本作为WPF的后端,岂不美哉?上网搜了一下解决方案,发现以下几种

  • IronPython
  • Pythonnet
  • Flask API
    最后决定使用Pythonnet作为在.Net中调用Python的工具,过程中遇到几个坑,在此处记录。

Pythonnet环境的配置

这个其实还好,基本遵照网上教程配置,只是有一点,我将Python脚本放到了跟WPF同一目录下,为了在WPF中获取文件夹根目录并加入Pythonnet环境,我作了以下代码设置:

/*设置基本的Python环境路径,我的机器用的Anaconda3*/
string pythonHomePath = @"C:\ProgramData\anaconda3";
string dllPath = @$"{pythonHomePath}\python311.dll";
string[] py_paths = {"DLLs", "Lib", "Lib/site-packages","Lib/site-packages/win32"
        ,"Lib/site-packages/win32/lib", "Lib/site-packages/Pythonwin","myPythonFiles"};
string pySearchPath = $"{pythonHomePath};";

foreach (string path in py_paths)
{
    pySearchPath += $"{pythonHomePath}/{path};";
}
/*获取当前运行程序的位置,这句话获取的是二进制文件的目录\项目名称\bin\Debug\net6.0-windows\*/
string current_path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
/*向上四次返回父目录,即可得到\项目名称*/
current_path = Directory.GetParent(current_path).FullName;
current_path = Directory.GetParent(current_path).FullName;
current_path = Directory.GetParent(current_path).FullName;
current_path = Directory.GetParent(current_path).FullName;

current_path += @$"\PythonScripts";

pySearchPath += $"{current_path};";

Pythonnet使用Py.Import导入文件仅生效一次,后导入的重名文件不会覆盖之前的

这一点是最坑的,导入了Python脚本之后,调用导入模块中的函数,发现报错,仔细排查发现原来是文件重复导入了。之前已经把我所有的Python文件拷贝到环境目录中,而我对工作目录中的Python进行了修改,发现添加的函数找不到。排查了一天发现是重复导入了
解决方案:
在环境中删除之前导入的文件即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值