Я пытаюсь запустить сценарий 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.
Спасибо,