Попытка запустить NSTask, но получаю ошибку - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть отдельное (стороннее) приложение, которое я пытаюсь запустить с помощью команды «kick». Я настроил свои файлы ~ / .bash_profile и / etc / bashrc так, чтобы я мог напечатать kick [command] в окне терминала, и он отлично работает. Поэтому я предполагаю, что у меня все настроено правильно.

Проблема возникает, когда я пытаюсь использовать NSTask.

По сути, я делаю создание двух изменяемых массивов, kickBuild и kickOut. Один для сборки команды (это строка флагов) и один для использования с NSTask. Я беру kickBuild и преобразовываю его в строку, разделенную пробелами, а затем добавляю это как объект во второй массив.

Таким образом, моя команда должна выглядеть примерно так: "kick -i /path/to/input/file.ext -as 2 -g 2.2" и т. Д. И если я наберу это в окне терминала, это будет работать большой.

kickBuild = [[NSMutableArray alloc] initWithCapacity:100];
kickOut = [[NSMutableArray alloc] initWithCapacity:2]; // Thinking that this should be "kick" and then "-i /path/to/input/file.ext -as 2 -g 2.2"
kickPath = [kickLocationTextField stringValue]; // This is just the path to my kick executable. NOT /bin/sh. Is that correct?
NSString *tempKick = [kickBuild componentsJoinedByString: @" "];
[kickOut addObject:tempKick];
[NSTask launchedTaskWithLaunchPath:kickPath arguments:kickOut];

Когда я создаю свое приложение и запускаю этот код, я получаю эту ошибку…

dyld: библиотека не загружена: build / darwin_x86_64 / gcc_opt_dynamic / core / libai.dylib

Ссылка от: /Users/Gene/Kick/Kick-3.3.4.0/bin/kick

Причина: изображение не найдено

Это NSLog из kickOut ... kick -i /Users/Gene/Test_Main.0001.ext -r 960 540 -as 2 -g 2.2 -v 5 -dp

Я что-то не так делаю? Или это проблема с пинком?

Как бы я протестировал NSTask с какой-то базовой терминальной задачей, чтобы убедиться, что я правильно использую NSTask?

kickBuild = [[NSMutableArray alloc] initWithCapacity:5];
kickOut = [[NSMutableArray alloc] initWithCapacity:2];
kickPath = @"/bin/sh";
[kickBuild addObject:@"-c"]; // Do I need this?
[kickBuild addObject:@"ls"];
[kickBuild addObject:@"~/Desktop"];
NSString *tempKick = [kickBuild componentsJoinedByString: @" "];
[kickOut addObject:tempKick];
[NSTask launchedTaskWithLaunchPath:kickPath arguments:kickOut];

Если я запускаю это без @ "- c", я получаю: / bin / sh: ls ~ / Desktop: Нет такого файла или каталога

Любая помощь приветствуется.

Спасибо за миллион

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Вот простой тест NSTask, который должен работать для вас (примечание: arguments: (NSArray *) arguments):

/*

gcc -Wall -O3 -x objective-c -fobjc-exceptions -framework Foundation -o nstask nstask.m

./nstask

/7701650/popytka-zapustit-nstask-no-poluchay-oshibku


launchedTaskWithLaunchPath:arguments:

Creates and launches a task with a specified executable and arguments.

+ (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments


*/

#import <Foundation/Foundation.h>

int main(int argc, const char *argv[])
{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSTask *task = [NSTask new];

NSMutableArray *kickBuild = [[NSMutableArray alloc] initWithCapacity:5];
//NSMutableArray *kickOut = [[NSMutableArray alloc] initWithCapacity:2];
NSString *kickPath = @"/bin/ls";

//[kickBuild addObject:@"/bin/ls"]; // Do I need this?
[kickBuild addObject: [@"~/Desktop" stringByExpandingTildeInPath]];

task = [NSTask launchedTaskWithLaunchPath: kickPath arguments: kickBuild];
[task waitUntilExit];


[pool release];

return 0;

}
1 голос
/ 22 февраля 2011

Ваши настройки среды не читаются при выполнении NSTask.

Я задал этот вопрос пару лет назад.

...