【问题标题】:Run python script from C# via command prompt通过命令提示符从 C# 运行 python 脚本
【发布时间】:2021-07-07 04:32:37
【问题描述】:

我正在开发一个 Winform 应用程序。我想通过命令提示符从 c# 运行 python 脚本(我正在使用System.Diagnostics.Process 类) 我有一个函数来运行需要传递 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 c# command


    【解决方案1】:

    几个小时后找到原因,我找到了。 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。感谢您的关注

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多