在 Swift 中收集 python 输出

Collect python output in Swift

是否可以将 .py 文件的输出存储在 swift 变量中? 在我的 xcode 项目中,我放置了一个 python 脚本。 我运行这个脚本使用这个代码

class ViewController: NSViewController {
    var pathForFile = Bundle.main.path(forResource: "eject", ofType: "py")
    let path = "/usr/bin/python/"
        
    override func viewDidLoad() {
            
            let arguments = [pathForFile]
            let task = Process.launchedProcess(launchPath: path, arguments: arguments as! [String])
            task.waitUntilExit()
            super.viewDidLoad()

        }
}

如果我将 print(x) 放入 python 文件中,执行后我可以在 xcode.
的输出 window 上看到 x 值我还尝试将 return x 放在 main 函数中,然后尝试在 swift 文件中设置 let y = task.waitUntilExit(),但我得到的唯一结果是一个空变量

我对swift了解不多,请见谅。提前致谢!

解决方案

如本页所述
https://www.hackingwithswift.com/example-code/system/how-to-run-an-external-program-using-process
并在 Willeke 建议的答案中显示,您可以使用 Pipe() 来做到这一点。
我更改了代码,如下所示。

override func viewDidLoad() {
    super.viewDidLoad()
    let task = Process()
    task.executableURL = URL(fileURLWithPath: "/usr/bin/python")
    let filename = Bundle.main.path(forResource: "eject", ofType: "py")
    task.arguments = [filename!]
    let outputPipe = Pipe()
    task.standardOutput = outputPipe
    
       do{
           try task.run()
       } catch {
           print("error")
       }
    
    let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(decoding: outputData, as: UTF8.self)
    print(output)
    
   }

一定要放这个

let outputPipe = Pipe()
task.standardOutput = outputPipe

task.run() 命令和这个

之前
let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
let output = String(decoding: outputData, as: UTF8.self)
print(output)

之后。