【问题标题】:Collect python output in Swift在 Swift 中收集 python 输出
【发布时间】:2022-01-21 15:28:45
【问题描述】:

是否可以将 .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的输出窗口看到x值。
我也尝试将return x放在主函数中,然后尝试设置@ 987654325@ 在 swift 文件中,但我唯一得到的是一个空变量

我对swift了解不多,所以请原谅我缺乏知识。提前致谢!

【问题讨论】:

标签: python swift macos cocoa


【解决方案1】:

解决方案

如本页所述
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)

在它之后。

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多