本来写的是这样:
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#中,字符串本身内部也使用双引号来定义。所以当你需要在字符串内包含一个实际的双引号字符时,你需要使用转义字符 \
来实现。在这里也就是:\"
在C#中使用双引号("
)包围路径或参数是一种常见的做法,特别是当路径或参数可能包含空格时。在编程和命令行语境中,空格通常被用作不同命令或参数的分隔符。如果一个参数内部包含空格,没有用双引号括起来的话,程序可能会错误地将其解释为多个参数。
这里的关键点是,双引号在传递到命令行之前是作为字符串的一部分被解释的,不会在C#中定义的这些参数外面再额外加上一个双引号。而是直接将每个参数值用一对双引号包裹,保证它们在作为命令行参数时的完整性和正确性。
当双引号传递到命令行之后,它们的角色从C#中的字符串分隔符转变为命令行参数的定界符。这意味着在C#代码中,双引号是用来确保字符串中的双引号被识别和处理为字符串的一部分,而当这些双引号和它们包围的内容被传递到命令行时,它们的功能转换为确保命令行解释器将被双引号包围的内容视为一个单独的参数。
还有一个问题是:
代码中使用了process.StandardInput.WriteLine("python Solver_test.py\n");
来启动Python脚本。如果已经有了process.Start();,那么这行代码不是必需的,或者它可能会覆盖或冲突导致参数没有被正确传递。
删掉这行,就可以正常运行了。
标签:process,双引号,C#,cmd,Python,参数,file,接收 From: https://www.cnblogs.com/ban-boi-making-dinner/p/18195277