如何在Blazor WebApp中通过pythonnet调用Python脚本(解决模块找不到问题)
在Blazor WebApp中使用pythonnet调用本地Python脚本的解决方案
模块找不到的核心原因是Python解释器的sys.path未包含你的脚本所在目录,以下是具体解决步骤:
1. 确保脚本文件配置正确
- 确认你的Python脚本文件名为
PythonCalls.py(与PyModule.Import的模块名完全一致),且文件内的test函数定义正确:def test(): return "Python脚本执行成功" - 在Visual Studio中右键该脚本文件,打开属性,设置复制到输出目录为「如果较新则复制」或「始终复制」,确保运行时脚本能被同步到程序输出目录。
2. 手动将脚本路径添加到Python的sys.path
Blazor WebApp运行时的工作目录可能不等于你的项目目录,需要主动获取脚本所在的绝对路径并添加到Python的搜索路径中:
修正后的完整代码示例:
using Python.Runtime; using System.IO; // 配置Python DLL路径 Runtime.PythonDLL = @"C:\Users\homepc\AppData\Local\Programs\Python\Python312\python312.dll"; // 初始化Python引擎 PythonEngine.Initialize(); try { using (Py.GIL()) { // 获取脚本所在的绝对路径(假设脚本在项目根目录,可根据实际子目录调整) string scriptDir = AppContext.BaseDirectory; // 如果脚本在子目录(比如PythonScripts文件夹),则修改为: // string scriptDir = Path.Combine(AppContext.BaseDirectory, "PythonScripts"); // 获取Python的sys模块 dynamic sys = Py.Import("sys"); // 将脚本目录添加到Python的搜索路径 sys.path.append(scriptDir); // 导入目标Python模块 PyObject pyScript = PyModule.Import("PythonCalls"); // 调用test函数并转换结果为字符串 string result = pyScript.InvokeMethod("test").ToString(); // 后续处理结果(比如绑定到Blazor组件属性) // ... } } finally { // 确保释放Python引擎资源 PythonEngine.Shutdown(); }
3. 额外注意事项
- 仅支持Blazor Server:Blazor WASM运行在浏览器沙箱中,无法直接调用本地Python DLL,因此该方案只适用于Blazor Server项目。
- 环境兼容性:确保你的Python环境已安装
pythonnet(执行pip install pythonnet),且Python版本与pythonnet版本兼容(Python 3.12需使用支持该版本的pythonnet版本)。 - 权限问题:运行Blazor Server的进程需要具备访问Python DLL和脚本文件的权限。
内容的提问来源于stack exchange,提问作者physics90
相关产品推荐
相关产品推荐

