2015-07-09 4 views
0

Я пытаюсь открыть терминал с Swift и запустить скрипт python. Я нашел эту функцию, чтобы сделать так:Открытый (интерактивный) терминал с Swift

(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) 

печати арг является: «питон /Users/michael/Documents/Python/testestest.py "

Что такое, если я вставляю его в терминал, действительную команду.

Но Xcode говорит мне: Не удалось posix_spawn: ошибка 13


Что бы вы посоветовали мне делать? Я не уверен, что нет простого способа запустить видимую консоль, на которой запущена команда. Еще одна проблема, о которой я думаю, заключается в том, что было бы здорово иметь выход в режиме реального времени в xcode (что означает увидеть результат, пока скрипт python все еще запущен), возможно ли это?

благодаря

ответ

0

python /Users/michael/Documents/Python/testestest.py работает в терминале, так как он вошел в/bin/Баш или другой интерпретатор оболочки. При выполнении команд оболочки с использованием NSTask у вас есть 2 варианта:

  1. Используйте bash, как в терминале.

    runCommand("/bin/bash" , args: "-c", "python " + folderPath + selecteditem)

  2. Вызов исполняемый непосредственно.

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

При использовании 2-й вариант, вы должны точно знать, где исполняемый, но на положительной стороне можно ввести каждый аргумент в качестве отдельного параметра функции RunCommand и вы не» t должны беспокоиться о том, чтобы сбрасывать кавычки вокруг них, как вы делаете с bash.

Смежные вопросы