【C#】【语法】从C#通过代码启动Python脚本没有接收到参数

本来写的是这样:

            ProcessStartInfo psi = new ProcessStartInfo
            {
                FileName = "cmd.exe",
                WorkingDirectory = FrmNewProject.GetFolderPath() + "\\SolverForEXE",
                RedirectStandardInput = true,//将标准输入流重定向,允许程序向cmd发送命令。
                RedirectStandardOutput = true,//将标准输出流重定向,允许程序捕获cmd的输出。
                RedirectStandardError = true,//将错误输出流重定向,允许程序捕获cmd的错误信息。
                UseShellExecute = false,//禁用shell的使用,这是必需的,因为需要重定向输入/输出流。
                CreateNoWindow = true,//启动进程时不创建新窗口,使其在后台运行。
                Arguments = $"{general_file} {topo_file} {stream_file} {solution_file}"
            };

            Process process = new Process
            {
                StartInfo = psi
            };

            process.Start();

            // 向cmd窗口发送命令
            process.StandardInput.WriteLine("python Solver_test.py\n");
            process.StandardInput.WriteLine("exit"); // 关闭cmd窗口

 

更正了参数格式:

Arguments = $"\"{general_file}\" \"{topo_info}\" \"{stream_info}\" \"{result_final}\""

 

  • 当你传递参数给命令行时,参数可能包含空格。例如:路径 C:\Program Files\Some Folder
  • 如果路径包含空格,命令行解释器会将其视为多个参数。为避免这种情况,需要用双引号将整个路径包裹起来。例如:"C:\Program Files\Some Folder"
  • 在C#中,我们用转义字符 \ 在字符串内包含实际的双引号,在这里也就是:\" ,使得生成的命令行参数被正确包裹。例如:Arguments = $"\"{general_file}\" \"{topo_info}\" \"{stream_info}\" \"{result_final}\""

生成的 arguments 字符串是:

"C:\Path\To\General File.txt" "C:\Path\To\Topo File.txt" "C:\Path\To\Stream File.txt" "C:\Path\To\Result File.txt"

 

这里转义字符表示的双引号并不是什么针对参数的特殊符号,这里就是在一个普通的字符串里输出的普通的双引号,为的是保证双引号里的内容在作为命令行参数时的完整性和正确性。只不过在命令行执行命令或ProcessStartInfo 类启动进程时,这二者解析Arguments 这个字符串参数时,C:\Path\To\GeneralFile.txt C:\Path\To\TopoFile.txt C:\Path\To\StreamFile.txt C:\Path\To\ResultFile.txt 和 "C:\Path\To\General File.txt" "C:\Path\To\Topo File.txt" "C:\Path\To\Stream File.txt" "C:\Path\To\Result File.txt" 都能被正确解析,后者的参数不会多出一层双引号。

 

还有一个问题是:

代码中使用了process.StandardInput.WriteLine("python Solver_test.py\n");来启动Python脚本。如果已经有了process.Start();,那么这行代码不是必需的,或者它可能会覆盖或冲突导致参数没有被正确传递。

删掉这行,就可以正常运行了。

posted @ 2024-05-16 09:11  ban_boi  阅读(27)  评论(0编辑  收藏  举报