C#通过外部进程调用Python
C#调用Python
C#调用Python有多种方式
- Process.Start 启动 Python 脚本
- IronPython 集成 Python 脚本
- Python.NET(Python for .NET)
- HTTP 请求调用 Python Flask/Django Web 服务
个人感觉第一种和第四种方式相对方便一点。
Whisper
Whisper 是由 OpenAI 开发的一种自动语音识别(ASR,Automatic Speech Recognition)系统,能够将语音转换成文字。它支持多种语言,并且具有很高的准确性和鲁棒性。Whisper 不仅能够识别标准的语音输入,还能够处理各种噪声、口音、方言以及多种语言的语音输入。Whisper支持Python,也有对应的库可以直接安装,这里就涉及到用什么方式调用Python了,后面选择了通过第一种方式外部进程调用python,以下是相关代码:
python目录结构:
C#相关代码:
using System;
using System.Diagnostics;
using System.IO;
class Program
{
static void Main()
{
// Python 解释器路径
string scriptPath = "";
string shellFileName = "";
string pythonExecutable = "";
string arguments = "";
switch (Environment.OSVersion.Platform)
{
case PlatformID.Win32S:
case PlatformID.Win32Windows:
case PlatformID.Win32NT:
case PlatformID.WinCE:
shellFileName = "cmd.exe";
pythonExecutable = @"C:\path\to\python.exe"; // 注意区分是使用全局python解释器还是项目环境的python解释器,根据不同情况这里有所不同
scriptPath = @"C:\path\to\app.py"; // 你的 Python 脚本路径
arguments = $"/C \"{pythonExecutable} \"{scriptPath}\"\""; // 直接执行 python 脚本
break;
case PlatformID.Unix:
case PlatformID.MacOSX:
shellFileName = "bash";
pythonExecutable = "/path/to/python"; // 注意区分是使用全局python解释器还是项目环境的python解释器,根据不同情况这里有所不同
scriptPath = @"/path/to/app.py"; // 你的 Python 脚本路径
arguments = $"-c \"{pythonExecutable} {scriptPath}\""; // 直接执行 python 脚本
break;
default:
throw new PlatformNotSupportedException();
}
ProcessStartInfo start = new ProcessStartInfo
{
FileName = shellFileName,
Arguments = arguments,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
// 启动进程
using (Process process = Process.Start(start))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.WriteLine(result); // 输出 Python 脚本的返回值
}
// 如果有错误输出
using (StreamReader reader = process.StandardError)
{
string errorResult = reader.ReadToEnd();
if (!string.IsNullOrEmpty(errorResult))
{
Console.WriteLine("Error: " + errorResult);
}
}
}
}
}
通过外部进程调用Python需要注意一个路径的问题,如果Python代码里面使用了相对路径,工作目录会指向到C#程序的而不是Python的代码,这个时候的相对路径会有问题,解决办法,
1、Python不使用相对路径,使用绝对路径
2、在Python代码里面切换工作目录,代码如下:
# 获取当前 Python 脚本所在的目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 将当前工作目录切换到 Python 脚本所在的目录
os.chdir(script_dir)