Tôi đang cố gắng chạy tập lệnh Python từ ứng dụng Cocoa. Nó làm việc tốt trên thread chính, nhưng tôi muốn có nó chạy trong nền, trên một hàng đợi GCD đồng thời.Chạy tập lệnh Python từ ứng dụng Cocoa bằng GCD
Tôi đang sử dụng các phương pháp sau đây để thiết lập một lớp học quản lý chạy các script 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);
}
Sau đó kịch bản là (nhiều lần) gọi từ phương pháp dụ sau đây, sử dụng một ví dụ singleton chia sẻ của lớp quản lý:
- (id)runScriptWithArguments:(NSArray *)arguments {
return [NSClassFromString(@"MyScriptExecutor") runWithArguments:arguments];
}
các Objective-C móc mã trên vào mã Python sau:
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)
Điều này làm việc khi tôi luôn chạy các phương pháp Objective-C ở trên từ hàng đợi chính, nhưng kịch bản trả về null khi chạy từ bất kỳ hàng đợi nào khác. Ai đó có thể giải thích cho tôi nếu những gì tôi đang cố gắng làm chỉ là không được hỗ trợ, và liệu có một cách tốt xung quanh nó?
Các tập lệnh Python được gọi thường xuyên và chạy lâu, do đó, thực hiện điều đó trên chuỗi chính sẽ quá chậm, sẽ chạy nó tạo thành hàng đợi nối tiếp. Ngoài ra, tôi muốn chứa mã đồng thời trong Objective-C càng nhiều càng tốt.
Cảm ơn,
Không đủ thông tin trong ví dụ này để thực sự biết bạn đang làm gì. – jkh
Bạn có thể cho tôi biết cách bạn tích hợp nhị phân Python với xcode không? – bijan