簡體   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