运行 python 来自 C# 的脚本,通过命令提示符
Run python script from C# via command prompt
我正在开发 Winform 应用程序。我想通过命令提示符从 c# 运行 python 脚本(我正在使用 System.Diagnostics.Process
class)
我有一个 运行 python 脚本的函数需要传递 python 脚本文件名。
public void Run(string cmd)
{
Process p = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = "python",
CreateNoWindow = true,
UseShellExecute = false,
ErrorDialog = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
WorkingDirectory = Directory.GetCurrentDirectory() + @"\PythonScripts",
Arguments = string.Format("{0}", cmd)
},
EnableRaisingEvents = true,
SynchronizingObject = this
};
p.OutputDataReceived += (s, e) => SetOutputText(e.Data);
p.ErrorDataReceived += (s, e) => SetErrorText(e.Data);
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
}
在我打印包含 unicode 字符的字符串之前,它可以正常工作。
我的 test.py
代码只包含一行。
print("xin chào việt nam")
当我从 start
编译此 test.py
命令提示符时,它工作得很好。但是当我通过命令提示符从 C# 编译时,我得到了这个错误:
Traceback (most recent call last):
File "test.py", line 1, in <module> \ufeffprint("xin chào vi\u1ec7t nam")
File "C:\Users\D Serious\AppData\Local\Programs\Python\Python36\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)
[0]UnicodeEncodeError: 'charmap' codec can't encode character '\u1ec7' in position 11: character maps to <undefined>
我认为这里的问题是由 C# 在 运行 命令提示符和读取 python 脚本时导致的,进程无法正确解码 utf8。谢谢。
经过几个小时的寻找原因,我终于找到了。 Python解码没有问题,就是命令提示符问题。所以我将我的功能修复为:
public void Run(string cmd)
{
Process p = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = "cmd",
CreateNoWindow = true,
UseShellExecute = false,
ErrorDialog = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
WorkingDirectory = Directory.GetCurrentDirectory() + @"\PythonScripts",
StandardOutputEncoding = Encoding.UTF8,
StandardErrorEncoding = Encoding.UTF8,
StandardInputEncoding = Encoding.UTF8
},
EnableRaisingEvents = true,
SynchronizingObject = this
};
p.Start();
using (StreamWriter sw = p.StandardInput)
{
sw.WriteLine("chcp 65001");
sw.WriteLine("set PYTHONIOENCODING=utf-8");
sw.WriteLine($"python {cmd}");
}
p.OutputDataReceived += (s, e) => SetOutputText(e.Data);
p.ErrorDataReceived += (s, e) => SetErrorText(e.Data);
p.WaitForExit();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
}
我添加了 sw.WriteLine("chcp 65001");
和 sw.WriteLine("set PYTHONIOENCODING=utf-8");
以获得更好的解码 unicode。感谢您的关注
我正在开发 Winform 应用程序。我想通过命令提示符从 c# 运行 python 脚本(我正在使用 System.Diagnostics.Process
class)
我有一个 运行 python 脚本的函数需要传递 python 脚本文件名。
public void Run(string cmd)
{
Process p = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = "python",
CreateNoWindow = true,
UseShellExecute = false,
ErrorDialog = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
WorkingDirectory = Directory.GetCurrentDirectory() + @"\PythonScripts",
Arguments = string.Format("{0}", cmd)
},
EnableRaisingEvents = true,
SynchronizingObject = this
};
p.OutputDataReceived += (s, e) => SetOutputText(e.Data);
p.ErrorDataReceived += (s, e) => SetErrorText(e.Data);
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
}
在我打印包含 unicode 字符的字符串之前,它可以正常工作。
我的 test.py
代码只包含一行。
print("xin chào việt nam")
当我从 start
编译此 test.py
命令提示符时,它工作得很好。但是当我通过命令提示符从 C# 编译时,我得到了这个错误:
Traceback (most recent call last):
File "test.py", line 1, in <module> \ufeffprint("xin chào vi\u1ec7t nam")
File "C:\Users\D Serious\AppData\Local\Programs\Python\Python36\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)
[0]UnicodeEncodeError: 'charmap' codec can't encode character '\u1ec7' in position 11: character maps to <undefined>
我认为这里的问题是由 C# 在 运行 命令提示符和读取 python 脚本时导致的,进程无法正确解码 utf8。谢谢。
经过几个小时的寻找原因,我终于找到了。 Python解码没有问题,就是命令提示符问题。所以我将我的功能修复为:
public void Run(string cmd)
{
Process p = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = "cmd",
CreateNoWindow = true,
UseShellExecute = false,
ErrorDialog = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
WorkingDirectory = Directory.GetCurrentDirectory() + @"\PythonScripts",
StandardOutputEncoding = Encoding.UTF8,
StandardErrorEncoding = Encoding.UTF8,
StandardInputEncoding = Encoding.UTF8
},
EnableRaisingEvents = true,
SynchronizingObject = this
};
p.Start();
using (StreamWriter sw = p.StandardInput)
{
sw.WriteLine("chcp 65001");
sw.WriteLine("set PYTHONIOENCODING=utf-8");
sw.WriteLine($"python {cmd}");
}
p.OutputDataReceived += (s, e) => SetOutputText(e.Data);
p.ErrorDataReceived += (s, e) => SetErrorText(e.Data);
p.WaitForExit();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
}
我添加了 sw.WriteLine("chcp 65001");
和 sw.WriteLine("set PYTHONIOENCODING=utf-8");
以获得更好的解码 unicode。感谢您的关注