2017-01-26 2 views
0

Я разрабатываю приложение macOS с помощью Objective-C, которое я хочу запускать с помощью некоторых команд, подобных терминалу. На самом деле я хочу запустить команду YOLO из своего приложения. Для этого я использую класс NSTask. Когда я запускаю команду через код, при запуске задачи, я получаю сообщение об ошибке «Не удалось открыть файл cfg/coco.data». Эта же команда отлично работает с терминалом, но не в моем приложении.Нужно выполнить команду в приложении Cocoa

Вот мой код:

NSTask *task; 
task = [[NSTask alloc] init]; 
[task setLaunchPath:@"/bin/bash"]; 

NSString *commandToRun = @"Desktop/darknet/ && ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg"; 

NSArray *arguments = [NSArray arrayWithObjects: 
         @"-c", 
         [NSString stringWithFormat:@"%@", commandToRun], 
         nil]; 
NSLog(@"run command: %@",commandToRun); 
[task setArguments: arguments]; 

NSPipe *pipe; 
pipe = [NSPipe pipe]; 
[task setStandardOutput: pipe]; 

NSFileHandle *file; 
file = [pipe fileHandleForReading]; 

[task launch]; 

NSData *data; 
data = [file readDataToEndOfFile]; 

NSString *output; 
output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
+0

Возможный дубликат [Как запустить команду терминала в быстром скрипте? (например, xcodebuild)] (http://stackoverflow.com/questions/26971240/how-do-i-run-an-terminal-command-in-a-swift-script-e-g-xcodebuild) – shallowThought

ответ

0

NSTask не оболочка. Это более низкий уровень, чем этот. Вы не можете запускать полные выражения оболочки, только одну команду. Поэтому ваш commandToRun не имеет смысла, это должен быть только путь к команде для запуска.

0

Вы можете использовать функцию system c для запуска команды, но она не дает большого контроля над деталями.