Я пытаюсь запустить Python script из приложения Cocoa. Он отлично работает в основном потоке, но я хотел бы, чтобы он работал в фоновом режиме в параллельной очереди GCD.
Я использую следующий метод для настройки класса менеджера, который запускает Python script:
- (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);
}
После чего вызов script вызван из следующего метода экземпляра, используя общий одноэлементный экземпляр класса менеджера:
- (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 из основной очереди, но script возвращает null при запуске из любой другой очереди. Может ли кто-нибудь объяснить мне, что то, что я пытаюсь сделать, просто не поддерживается, и есть ли там хороший способ?
Сценарии Python вызывают часто и работают долго, поэтому выполнение этого основного потока будет слишком медленным, а будет запускать его из очереди. Кроме того, я хотел бы максимально содержать код concurrency внутри Objective-C.
Спасибо,