.NET Core调用Python脚本时遇TensorFlow模块找不到错误
解决.NET Core调用Python脚本时的ModuleNotFoundError(tensorflow模块找不到)
核心问题分析
在Ubuntu服务器上,手动执行Python脚本能正常加载tensorflow,但通过.NET Core调用时失败,本质是两种执行环境的环境变量、用户上下文或Python版本不匹配。
具体解决方案
1. 不要覆盖PYTHONPATH,改为追加路径
当前代码直接赋值PYTHONPATH会覆盖原有环境变量,导致系统默认Python包路径丢失。修改为追加逻辑:
// 替换原PYTHONPATH赋值代码 var existingPythonPath = start.EnvironmentVariables.ContainsKey("PYTHONPATH") ? start.EnvironmentVariables["PYTHONPATH"] : string.Empty; start.EnvironmentVariables["PYTHONPATH"] = $"{existingPythonPath}:/home/ubuntu/.local/lib/python3.12/site-packages";
2. 确认Python版本与终端一致
终端执行以下命令,获取手动运行时使用的Python路径和版本:
which python3 python3 --version
如果输出路径是/home/ubuntu/.local/bin/python3(而非/usr/bin/python3),说明终端用的是用户本地安装的Python,修改C#代码中的Python路径:
FileName = "/home/ubuntu/.local/bin/python3",
3. 调整.NET进程的权限与用户上下文
若.NET Core以Web服务形式部署(如Nginx/Apache反向代理),通常会以www-data用户运行,而tensorflow安装在ubuntu用户的.local目录下:
- 给站点包目录添加
www-data的读取权限:
sudo chmod -R o+r /home/ubuntu/.local/lib/python3.12/site-packages
- 或修改.NET服务配置(如systemd服务文件),将运行用户改为
ubuntu:
[Service] User=ubuntu
4. 添加调试输出定位差异
在Python脚本开头加入以下代码,查看运行时的实际环境信息,对比终端执行结果:
import sys import os print("=== Debug Info ===") print("Python Executable:", sys.executable) print("PYTHONPATH:", os.environ.get("PYTHONPATH", "Not set")) print("sys.path:", sys.path)
通过.NET获取这些输出,可快速定位路径未加载或版本不匹配的问题。
内容的提问来源于stack exchange,提问作者Abdurrahman yeşilyurt
相关产品推荐
相关产品推荐

