swift - 使用 Swift 打开(交互式)终端

标签 swift terminal xcode6

我正在尝试使用 Swift 打开终端并从那里运行 python 脚本。我发现这个函数可以做到这一点:

( Get terminal output after a command swift )

    func runCommand(cmd : String, args : String...) -> (output: [String], error: [String], exitCode: Int32) {

    var output : [String] = []
    var error : [String] = []

    let task = NSTask()
    task.launchPath = cmd
    task.arguments = args

    let outpipe = NSPipe()
    task.standardOutput = outpipe
    let errpipe = NSPipe()
    task.standardError = errpipe

    task.launch()

    let outdata = outpipe.fileHandleForReading.readDataToEndOfFile()
    if var string = String.fromCString(UnsafePointer(outdata.bytes)) {
        string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
        output = string.componentsSeparatedByString("\n")
    }

    let errdata = errpipe.fileHandleForReading.readDataToEndOfFile()
    if var string = String.fromCString(UnsafePointer(errdata.bytes)) {
        string = string.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
        error = string.componentsSeparatedByString("\n")
    }

    task.waitUntilExit()
    let status = task.terminationStatus

    return (output, error, status)
}

我正在调用该函数,就像问题中所写的那样:

let output =  runCommand("/usr/bin" , args: "python " + folderPath + selecteditem)

args 的打印是:“python/Users/michael/Documents/Python/testestest.py”

如果我将其粘贴到终端中,这是一个有效的命令。

但是 xCode 告诉我:无法 posix_spawn:错误 13

<小时/>

你建议我做什么?我不确定是否有更简单的方法来启动正在运行命令的可见控制台。我正在考虑的另一个问题是,在 xcode 中实时输出会很棒(意味着在 python 脚本仍在运行时查看输出)这可能吗?

谢谢

最佳答案

python/Users/michael/Documents/Python/testestest.py 在终端中工作,因为它被输入到/bin/bash 或其他 shell 解释器中。使用 NSTask 运行 shell 命令时,您有 2 个选项:

  1. 像在终端中一样使用 bash。

    runCommand(“/bin/bash”,参数:“-c”,“python”+folderPath+selecteditem)

  2. 直接调用可执行文件。

    runCommand("/usr/bin/python", args:folderPath + selecteditem)

如果您使用第二个选项,您必须确切地知道可执行文件在哪里,但从好的方面来说,您可以将每个参数作为单独的参数输入到 runCommand 函数中,并且不必担心在周围放置转义引号就像您对 bash 所做的那样。

关于swift - 使用 Swift 打开(交互式)终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31314810/

相关文章:

macos - Homebrew 错误 : No formulae found in taps

linux - 使用包含文件夹的名称搜索并替换为多个文件

ios - swift语言如何在SingleTon类中设置NSDictionary

android - 在 Android Studio 上运行终端命令

swift - 当 iAd 横幅出现时,如何将 View 内容向上移动? (以 Swift 编程方式)

swift - Firebase Firestore 查询未执行

swift - 为什么以及何时应该使用可选函数(在 Swift 中)?

ios - 这个 swift 函数发生了什么?

swift - 找不到接受提供的参数的 '+'

swift - 想要从数组创建特定的属性值数组