从C#调用带大参数的Python可执行文件时遇路径过长错误
解决C#调用Python可执行文件传递大参数的问题
Windows系统对命令行参数长度有默认上限(通常为8191字符),直接通过Arguments传递大字符串会触发"The filename or extension is too long"错误。以下是两种实用的替代方案:
方案一:通过标准输入(stdin)传递参数
利用进程的标准输入流传递大内容,避免命令行长度限制。
C# 代码
using System.Diagnostics; using System.IO; // 配置进程启动信息 ProcessStartInfo start = new ProcessStartInfo(); start.FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Components\test.exe"); start.UseShellExecute = false; start.CreateNoWindow = true; start.RedirectStandardInput = true; // 启用标准输入重定向 using (Process process = Process.Start(start)) { // 将参数写入标准输入,用换行符分隔不同参数 process.StandardInput.WriteLine(CAP); process.StandardInput.WriteLine(SDT); process.StandardInput.WriteLine(EFF); process.StandardInput.Close(); // 关闭输入流,告知子进程数据已发送 process.WaitForExit(); // 可选:等待Python进程执行完成 }
Python 代码(test.py,打包为exe前的源码)
import sys def main(): # 从标准输入按行读取参数,去除首尾空白符 cap = sys.stdin.readline().strip() sdt = sys.stdin.readline().strip() eff = sys.stdin.readline().strip() # 这里添加你的业务逻辑处理代码 if __name__ == "__main__": main()
方案二:通过临时文件传递参数
将大参数序列化后写入临时文件,仅传递文件路径作为命令行参数,Python端读取文件内容解析参数。
C# 代码
using System.Diagnostics; using System.IO; using System.Text.Json; // 创建临时文件并写入参数(用JSON格式序列化多个参数) string tempFilePath = Path.GetTempFileName(); var parameters = new { CAP = CAP, SDT = SDT, EFF = EFF }; string jsonContent = JsonSerializer.Serialize(parameters); File.WriteAllText(tempFilePath, jsonContent); // 配置进程启动信息 ProcessStartInfo start = new ProcessStartInfo(); start.FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Components\test.exe"); start.Arguments = tempFilePath; // 仅传递临时文件路径 start.UseShellExecute = false; start.CreateNoWindow = true; using (Process process = Process.Start(start)) { process.WaitForExit(); // 执行完成后删除临时文件(可选) File.Delete(tempFilePath); }
Python 代码(test.py,打包为exe前的源码)
import sys import json def main(): if len(sys.argv) < 2: return temp_file_path = sys.argv[1] # 读取并解析临时文件中的JSON参数 with open(temp_file_path, 'r', encoding='utf-8') as f: parameters = json.load(f) cap = parameters['CAP'] sdt = parameters['SDT'] eff = parameters['EFF'] # 这里添加你的业务逻辑处理代码 if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者vignesh duraivel
相关产品推荐
相关产品推荐

