Проблема
Я пытаюсь вызвать функцию Python из моего исполняемого файла Swift.
Это работало идеально, пока аргументы не стали слишком длинными, и я не начал получатьошибка:
необработанное исключение NSInternalInconsistencyException
причина: «Не удалось posix_spawn: ошибка 7»
, что по сути означает, что данные, которые я отправляюкод Python для обработки (мой аргумент) слишком длинный.
Последняя альтернатива
Наиболее очевидным решением является запись данных в файл и отправка скриптупуть к этому файлу, содержащему данные.Это сопровождается очевидными ограничениями производительности.
Потенциально лучшая альтернатива
Это то, что мне нужно помочь: я думал, что это может быть возможно буфер эти данные вместо того, чтобы отправлять все это одним куском.
Я пытался исследовать это, используя множество различных комбинаций ключевых слов, и за последний день читал много статей в Интернете, но ни одна не ответила на мой вопрос: так ли это?можно буферизовать данные, чтобы обойти ограничение на ядро ARG_MAX
около 260000 байтов, используя Process
es и Pipe
s?
Код
Поскольку всегда можно увидеть код, который я сейчас использую для вызова функций Python, у меня есть следующее:
@discardableResult
public static func shell(_ args: String...) -> String {
let task = Process()
task.launchPath = "/usr/bin/env"
task.arguments = args
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
task.waitUntilExit()
// return task.terminationStatus
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = String(data: data, encoding: String.Encoding.utf8)!
return output
}
// public static func shell(_ args: String...) -> String {}
И чуть позже:
//
// Call classifier on data
//
let pyStcriptPath = "\(Bundle.main.bundlePath)/Classification/****Classify.py"
//
// The fonction I'm calling here, 'shell', is the one defined just above in my question
//
let pyResult = shell("python", pyStcriptPath, "\(featureVector)", "\(signalType)")