Запуск сценария Python из приложения Какао с использованием GCD

Я пытаюсь запустить сценарий Python из приложения Какао. Он отлично работает в основном потоке, но я бы хотел, чтобы он работал в фоновом режиме в параллельной очереди GCD.

Я использую следующий метод для установки класса менеджера, который запускает скрипт Python:

- (BOOL)setupPythonEnvironment {
    if (Py_IsInitialized()) return YES;

    Py_SetProgramName("/usr/bin/python");
    Py_Initialize();

    NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"MyScript"     ofType:@"py"];

    FILE *mainFile = fopen([scriptPath UTF8String], "r");
    return (PyRun_SimpleFile(mainFile, (char *)[[scriptPath lastPathComponent] UTF8String]) == 0);
}

После чего скрипт (многократно) вызывается из следующего метода экземпляра с использованием совместно используемого одноэлементного экземпляра класса менеджера:

- (id)runScriptWithArguments:(NSArray *)arguments {
    return [NSClassFromString(@"MyScriptExecutor") runWithArguments:arguments];
}

Вышеупомянутый код Objective-C подключается к следующему коду Python:

from Foundation import *

def run_with_arguments(arguments):
#    ...a long-running script

class MyScriptExecutor(NSObject):
    @classmethod
    def runWithArguments_(self, arguments):
        return run_with_arguments(arguments)

Это работает, когда я всегда запускаю указанные выше методы Objective-C из основной очереди, но сценарий возвращает null при запуске из любой другой очереди. Может ли кто-нибудь объяснить мне, что то, что я пытаюсь сделать, просто не поддерживается, и есть ли хороший способ обойти это?

Сценарии Python вызываются часто и выполняются долго, поэтому выполнение этого в основном потоке будет слишком медленным , a будет запускать его из последовательной очереди. Кроме того, я хотел бы как можно больше содержать код параллелизма в Objective-C.

Спасибо,

15
задан ipmcc 19 January 2012 в 02:01
поделиться