记录使用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进行了修改,发现添加的函数找不到。排查了一天发现是重复导入了
解决方案:
在环境中删除之前导入的文件即可