我正在尝试使用 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 个选项:
像在终端中一样使用 bash。
runCommand(“/bin/bash”,参数:“-c”,“python”+folderPath+selecteditem)
直接调用可执行文件。
runCommand("/usr/bin/python", args:folderPath + selecteditem)
如果您使用第二个选项,您必须确切地知道可执行文件在哪里,但从好的方面来说,您可以将每个参数作为单独的参数输入到 runCommand 函数中,并且不必担心在周围放置转义引号就像您对 bash 所做的那样。
关于swift - 使用 Swift 打开(交互式)终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31314810/