最稳妥方式是C#用Process.Start启动Python子进程,绝对路径调用Python解释器,参数与结果通过临时JSON文件传递,同时重定向stdout/stderr并检查ExitCode。
用 Process.Start 启动 Python 脚本最稳妥
直接调用 python 模型,c# 最少依赖、最可控的方式就是起子进程。别碰 ironpython 或 python.net——它们对 numpy/torch 兼容差,版本一升级就报 importerror 或 dllnotfoundexception。
关键不是“能不能调”,而是“参数怎么传不丢、结果怎么拿不乱”。常见错误是把 JSON 字符串拼进命令行,遇到空格、单引号、换行就崩,或者没设 UseShellExecute = false 导致重定向失效。
-
ProcessStartInfo必须设UseShellExecute = false,否则RedirectStandardOutput无效 - Python 脚本路径用绝对路径,避免工作目录导致
ModuleNotFoundError - 参数统一走
Arguments字符串,不要在代码里拼接命令行;复杂数据先写入临时文件,再把文件路径当参数传过去 - 务必设
WaitForExit(30000)加超时,防 Python 卡死拖垮 C# 主程序
传参别信命令行拼接,改用临时 JSON 文件
用户常试:python predict.py --input "{'x': [1,2,3]}" —— 这在 Windows cmd 下直接被截断,PowerShell 又要转义嵌套引号,纯属自找麻烦。
真实场景里,模型输入往往是多维数组、嵌套字典,命令行长度还受限(Windows 约 8191 字符)。绕开它,只传一个文件路径最稳。
- C# 侧用
JsonSerializer.Serialize写入Path.GetTempFileName(),生成类似C:Users... mpA1B2.json的路径 - Python 脚本用
sys.argv[1]拿到该路径,再用json.load(open(sys.argv[1]))读 - 脚本末尾把结果也写成 JSON 到另一个临时文件,C# 再读取——比 stdout 解析更抗干扰
- 记得 C# 里
File.Delete清理两个临时文件,不然磁盘悄悄吃满
捕获 Python 报错不能只看 StandardOutput
很多模型出错根本不会往 stdout 打印,而是走 stderr,比如 torch.cuda.is_available() 失败时只在 stderr 输出 CUDA error: no kernel image is available。只读 StandardOutput 会误判为“运行成功但没返回”。
- 必须同时启用
RedirectStandardError = true - 调用
process.StandardError.ReadToEnd()和process.StandardOutput.ReadToEnd()都要在WaitForExit()之后 - 检查
process.ExitCode != 0是硬门槛,哪怕StandardOutput有内容也要当失败处理 - 如果 Python 脚本自己没加
try/except,建议包一层:用if __name__ == "__main__":块兜底,所有异常都print到 stderr 并sys.exit(1)
Windows 上 Python 路径别硬编码 python
用户装了 Anaconda、Miniconda、pyenv 或多个 Python 版本时,python 命令可能指向 3.8,而模型依赖 3.10+ 的语法,直接报 SyntaxError。或者企业环境禁用 PATH 查找,python 根本找不到。
- 用注册表或
where python动态查路径(C# 里跑Process.Start("cmd", "/c where python")),但更推荐配置化 - 在 appsettings.json 里存
"PythonRuntime": "C:\Python310\python.exe",启动时读取 - 启动前加校验:用
File.Exists(pythonPath)+Process.Start(pythonPath, "--version")测试可执行性 - 别忽略位数匹配:C# 是 x64,Python 就不能是 x86,否则
BadImageFormatException
临时文件路径、stderr 捕获、Python 可执行路径——这三个点漏掉任何一个,上线后都会在凌晨三点弹出告警。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











