You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux Docker容器中.NET Core调用命令无法设置输入文件的解决方法

问题原因

你遇到的问题根源是shell输入重定向符号<未被解析。在终端执行命令时,< data/file-list.txt由shell(如bash)处理,它会把data/file-list.txt的内容作为标准输入传递给./darknet;但你的.NET Core Process配置中UseShellExecute = false,此时不会通过shell执行命令,<会被当成普通参数传给darknet,导致它误以为要加载名为<的文件,从而报错。

解决方案

以下两种方法可解决该问题:

方法1:通过Shell执行完整命令

直接调用Linux shell(如bash)来处理命令中的重定向逻辑,避免参数解析错误:

public static string RunCommandViaShell(string fullCommand)
{
    var process = new Process()
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "/bin/bash",
            Arguments = $"-c \"{fullCommand}\"",
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false,
            CreateNoWindow = true,
            WorkingDirectory = Directory.GetCurrentDirectory()
        }
    };

    process.Start();
    // 先读取输出再等待退出,避免缓冲区死锁
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();
    process.WaitForExit();
    
    return $"{output}{Environment.NewLine}-------------------------------{Environment.NewLine}{error}";
}

调用示例:

string fullCommand = "./darknet detector test -out result.json < data/file-list.txt";
string output = ProcessRunner.RunCommandViaShell(fullCommand);

注意:如果命令包含引号等特殊字符,需自行转义,避免bash解析错误。

方法2:手动处理标准输入重定向

不依赖shell,自行读取输入文件内容并写入Process的标准输入流,这种方式更可控:

public static string RunCommandWithInputRedirect(string command, string args, string inputFilePath)
{
    var process = new Process()
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = command,
            Arguments = args, // 移除`< data/file-list.txt`部分
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            RedirectStandardInput = true, // 开启标准输入重定向
            UseShellExecute = false,
            CreateNoWindow = true,
            WorkingDirectory = Directory.GetCurrentDirectory()
        }
    };

    process.Start();

    // 读取输入文件并写入进程标准输入
    using (var inputStream = process.StandardInput)
    using (var fileStream = new StreamReader(inputFilePath))
    {
        inputStream.Write(fileStream.ReadToEnd());
        inputStream.Close(); // 关闭输入流,告知darknet输入已结束
    }

    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();
    process.WaitForExit();
    
    return $"{output}{Environment.NewLine}-------------------------------{Environment.NewLine}{error}";
}

调用示例:

string args = "detector test -out result.json";
string output = ProcessRunner.RunCommandWithInputRedirect("./darknet", args, "data/file-list.txt");
注意事项
  • 确保WorkingDirectory设置正确,保证darknet能找到data/file-list.txt及相关模型文件。
  • 方法1中若使用UseShellExecute = true,则无法同时开启RedirectStandardOutput或RedirectStandardError,因此更推荐直接调用bash的方式。
  • 方法2适合需要动态生成输入内容的场景,不限于读取静态文件。

内容的提问来源于stack exchange,提问作者Alex Zaitsev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:10:28