等待NSTask完成其终端命令的执行

时间:2019-03-13 14:10:14

标签: python ios objective-c

我正在构建一个使用NSTask调用python脚本的Cocoa应用程序。

NSPipe *pipe = [NSPipe pipe];
NSFileHandle *file = pipe.fileHandleForReading;
NSTask *task = [[NSTask alloc] init];

[task setLaunchPath:@"/anaconda3/bin/python"]; // Python path
[task setArguments:@[@"run.py"]];  //My program to be executed on terminal
task.standardOutput = pipe;
task.standardError = pipe;
[task launch];
[task waitUntilExit];

NSData *data = [file readDataToEndOfFile];
[file closeFile];

NSString *output = [[NSString alloc] initWithData: data encoding:NSUTF8StringEncoding];
NSLog (@"output:\n%@", output);

当我尝试运行一个小python程序(如使用NSTask打印hello world)时,它将被执行。但是,当我尝试执行需要花费较长时间(约40秒)才能通过NSTask执行的程序时,该程序未执行,并且无法从终端获取输出字符串。

如何确保我的代码在终端中执行,然后将控件传递给程序中的下一个语句?

1 个答案:

答案 0 :(得分:0)

您可以在启动任务后添加NSTask的waitUntilExit方法,该方法会阻止或让任务在后台运行,并在文件管道中使用NSFileHandle的readToEndOfFileInBackgroundAndNotify并为{{1 }}通知。