带破折号的 ProcessStartInfo 参数无法正确识别

问题描述 投票:0回答:1

我在将虚线参数传递给 cmd.exe 以执行 (Python) 脚本时遇到问题。

确实有效的代码(没有虚线参数)

            ProcessStartInfo psi = new()
            {
                FileName = "cmd.exe",
                Arguments = $"/c \"rembg i {inputPath} {outputPath}\"",
                RedirectStandardError = true,
                RedirectStandardOutput = true,
            };
            Process proc = Process.Start(psi);
            string output = proc.StandardOutput.ReadToEnd();
            string error = proc.StandardError.ReadToEnd();
            await proc.WaitForExitAsync();

不起作用的代码(带有虚线参数)

            ProcessStartInfo psi = new()
            {
                FileName = "cmd.exe",
                Arguments = $"/c \"rembg i -a -ae 15 {inputPath} {outputPath}\"",
                RedirectStandardError = true,
                RedirectStandardOutput = true,
            };
            Process proc = Process.Start(psi);
            string output = proc.StandardOutput.ReadToEnd();
            string error = proc.StandardError.ReadToEnd();
            await proc.WaitForExitAsync();

有趣的是,直接在 cmd shell 中运行时,这两种情况都会产生正确的结果:

rembg i INPUT_PATH OUTPUT_PATH

或者:

rembg i -a -ae 15 INPUT_PATH OUTPUT_PATH

即使在 cmd shell 中直接作为 cmd 进程运行,它也可以工作,例如:

cmd /c "rembg i -a -ae 15 INPUT_PATH OUTPUT_PATH"

除非我遗漏了一些非常明显的东西,否则问题似乎在于将虚线参数传递给脚本,该脚本直接从 cmd shell 以及从 shell 启动新的 cmd 进程时正常工作。

编辑:

这是在

StandardError
内收到的错误,源自
rembg
:

Traceback (most recent call last):
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\Scripts\rembg.exe\__main__.py", line 7, in <module>
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1128, in __call__
    return self.main(*args, **kwargs)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\rembg\cli.py", line 87, in i
    output.write(remove(input.read(), session=new_session(model), **kwargs))
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\rembg\bg.py", line 116, in remove
    cutout = alpha_matting_cutout(
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\rembg\bg.py", line 52, in alpha_matting_cutout
    alpha = estimate_alpha_cf(img_normalized, trimap_normalized)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\pymatting\alpha\estimate_alpha_cf.py", line 53, in estimate_alpha_cf
    L = cf_laplacian(image, **laplacian_kwargs, is_known=is_known)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\pymatting\laplacian\cf_laplacian.py", line 168, in cf_laplacian
    _cf_laplacian(image, epsilon, radius, values, indices, indptr, is_known)
  File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\pymatting\laplacian\cf_laplacian.py", line 8, in _cf_laplacian
    assert d == 3
AssertionError
c# .net cmd processstartinfo
1个回答
0
投票

通过一些额外的测试,我找到了它的工作方式。

因此,在

rembg
之前处理过图像之后,
SixLabors.ImageSharp
脚本将作为 C# 代码的一部分运行。

但是,当我将图像保存为 PNG 类型(使用

Image.SaveAsPngAsync()
)时,表示 alpha 抠图的
rembg
脚本的附加破折号参数将不起作用。当我将图像保存为 JPEG (
Image.SaveAsJpegAsync()
) 后,Alpha 抠图就完成了。否则,如果没有 alpha matting 参数,
rembg
脚本将正确执行 PNG 格式,这就是为什么我不怀疑图像格式本身是问题所在。

如果其他人能够更清楚地说明其工作原理,将会很有帮助。我认为这是由于不同图像格式及其处理的性质造成的。否则,我希望仅此一项就可以帮助其他遇到同样问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.