繁体   English   中英

Swift macOS 应用程序中使用 arguments 的调用过程

[英]Call Process with arguments in Swift macOS App

我正在尝试从我的 Swift macOS 应用程序运行一个进程。 但是,我无法将 arguments 格式化为我的进程。

到目前为止,以下代码运行良好:

let task = Process()
var environment =  ProcessInfo.processInfo.environment
environment["PATH"] = "/usr/local/bin"
task.environment = environment
task.currentDirectoryPath = "/usr/local/bin"
task.executableURL = URL(fileURLWithPath: "/usr/local/bin/convert")
task.arguments = [filename, filename+".pdf"]
            
let outputPipe = Pipe()
let errorPipe = Pipe()
task.standardOutput = outputPipe
task.standardError = errorPipe
...
try! task.run()

当我尝试将 arguments "-trim" , "-fuzz 10%"添加到现有任务中task.arguments程序崩溃。 过程错误是:

New error: convert: unrecognized option `-fuzz 10%' @ error/convert.c/ConvertImageCommand/1718.

如何正确格式化这些 arguments 以运行该过程?

当您在命令行上运行命令时,您的 shell 通常会拆分 arguments 以通过空格传递给程序 - 当您运行类似的命令时

/usr/local/bin/convert -trim -fuzz 10% <input> <output>

shell 将拆分这些 arguments 并将它们传递给convert ,如下所示:

["/usr/local/bin/convert", "-trim", "-fuzz", "10%", "<input>", "<output>"]

convert解析您传入的 arguments 时,它会遍历这些 arguments 并尝试将它们与它接受的已知列表进行匹配。 它查找它识别的-fuzz -trim它接受10%作为-fuzz的参数......等等。

当您直接从代码执行程序时,无论是通过Process ,还是通过较低级别的execveposix_spawn ,您传入的 arguments 都会直接转发到接收进程。 在您原来的情况下,这意味着收到了convert

["/usr/local/bin/convert", "-trim", "-fuzz 10%", "<input>", "<output>"]

convert和许多其他程序,不要在空格本身上进一步拆分 arguments ,因此当它尝试将-fuzz 10%的全部内容作为单个命令行选项(空格和全部)进行匹配时,它找不到任何东西。

这相当于运行

/usr/local/bin/convert -trim "-fuzz 10%" <input> <output>

在命令行上,引号会阻止您的 shell 在空格上拆分单词。 当我在我的机器上本地运行该命令时,我得到了完全相同的错误:

convert: unrecognized option `-fuzz 10%' @ error/convert.c/ConvertImageCommand/1718.

解决方案是对 shell 进行同样的拆分,并将每个参数作为自己的字符串单独传递:

task.arguments = ["-trim", "-fuzz", "10%", filename, filename+".pdf"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM