【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();,那么这行代码不是必需的,或者它可能会覆盖或冲突导致参数没有被正确传递。
删掉这行,就可以正常运行了。