我在执行不同的NSTask时遇到了麻烦。相同launchPath
,不同arguments
。我有一个类的实例管理自己的NSTask
对象,并根据参数初始化这些实例,正在创建依赖NSTask
对象。我有两个初始化器:
// Method for finished task
- (void)taskFinished:(NSNotification *)aNotification {
[myTask release];
myTask = nil;
[self createTask];
}
// Designated initializer
- (id) init {
self = [super init];
if (self != nil) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(taskFinished:)
name:NSTaskDidTerminateNotification
object:nil];
[self createTask];
}
return self;
}
// Convenience initializer
- (id)initWithCommand:(NSString *)subCommand {
self = [self init];
if (self)
{
[self setCommand:subCommand];
}
return self;
}
这是createTask
方法:
- (void)createTask {
// myTask is a property defined as NSTask*
myTask = [[NSTask alloc] init];
[myTask setLaunchPath:@"/usr/bin/executable"];
}
通过在NSOutlineView中选择不同的行来执行操作(使用PXSourceList作为包装器):
- (void)sourceListSelectionDidChange:(NSNotification *)notification {
id sourceList = [notification object];
NSIndexSet *selection = [sourceList selectedRowIndexes];
NSString *identifier = [[sourceList itemAtRow:[selection firstIndex]] identifier];
// this way `/usr/bin/executable ${identifier}` is being created
MyCommand *command = [[MyCommand alloc] initWithSubcommand:identifier];
// this method executes [myTask launch];
[command execute]
}
问题是只有第一个被执行。第二个甚至不会触发“点击”事件(通过目标 - 动作)。我认为这可能是我尝试使用的launchPath的原因,因为简单的/bin/ls
工作正常。终端中的相同命令具有0返回值(即一切正常)。任何指南或陷阱都非常感谢。
答案 0 :(得分:1)
我无法理解为什么 ......但是从numerous places读取NSTask只能运行一次......
使用NSTask,您的程序可以将另一个程序作为子进程运行,并可以监视该程序的执行情况。 NSTask创建一个单独的可执行实体;与NSThread不同,它不与父进程共享内存空间。 默认情况下,任务继承其父环境的若干特征:当前目录,标准输入,标准输出,标准错误以及任何环境变量的值。如果要更改其中任何一个,例如当前目录,则必须在启动任务之前设置新值。任务环境一旦启动就建立起来。
NSTask只能运行一次。后续尝试运行NSTask会引发错误。
如果从基于文档的应用程序中的文档运行任务,则应该(至少)将终止消息发送到文档清理代码中的任务实例。 有关更多讨论,另请参阅NSTaskTermination。
这看起来很荒谬......如果我发现任何与此消息来源相矛盾的信息,我会研究并发回信息(虽然它通常是可靠的。)
答案 1 :(得分:0)
如果你想涉及围绕PyObjC的阴暗水域,你可以轻松地使用Python的subprocess
机制.. over,over,over。哦是的。