Как получить доступ к кастомной быстрой или целевой c фреймворку из python - PullRequest
0 голосов
/ 26 сентября 2018

Большая часть примера демонстрирует вызов фреймворка Python из кода swift / target-c.но я хочу сделать наоборот, я хочу вызвать открытые функции swift из python. Есть ли способ сделать это?

Каков наилучший способ показать пользовательскую, специфичную для приложения несистемную платформу (т. Е. Не в одной из оболочек фреймворка, поставляемых с PyObjC) классы, написанные в Objective-C / swift для python через мост PyObjC.

Я хочу разработать «гибридное» приложение , в котором некоторые части приложения находятся в Objective-C / swift, а другие - в python, с интегрированием двух сторон через мост PyObjC.,

Большая часть документации, которую я смог найти, похоже, сосредоточена на ситуациях, когда цель состоит в том, чтобы весь код приложения был в Python, и чтобы Python вызывал классы AppKit и т. Д.через мост и упакованные рамки системы.

1 Ответ

0 голосов
/ 31 декабря 2018

Основной вариант использования PyObjC - доступ к коду Objective-C из Python, но можно использовать PyObjC для реализации некоторых функций для приложения ObjC / Swift в Python.

Это едва ли документировано влучше всего.Для этого есть два пути:

  1. Реализация поддержки пакетов плагинов и создание пакета плагинов с кодом Python (используя py2app для упаковки).Это задокументировано в очень старом учебнике по PyObjC: https://pyobjc.readthedocs.io/en/latest/tutorials/embedded.html

  2. Добавить явную поддержку расширения Python для приложения.

Я бы пошел навторой вариант, потому что, в конце концов, его легче реализовать.

Для этого вам нужно сделать несколько вещей:

  1. Инициализировать интерпретатор Python изапустить код запускаСмотрите «Py_Initialize ()» и «PyRun_SimpleString ()», чтобы начать работу (или руководство по внедрению Python в приложение).

    Обязательно освободите GIL после запуска кода запуска (это обычно не требуется при встраивании, но необходимо при использовании PyObjC и особенно, когда разные потоки могут вызывать код Python)

  2. Представьте ObjC API для Python

    Это может быть легко или сложно, в зависимости от того, насколько сложен интерфейс между двумя частями.Экспонировать классы ObjC для Python очень просто: просто используйте objc.lookUpClass (classname), чтобы получить доступ к классу ObjC в Python.Это автоматически предоставляет любые методы для класса.

    Доступ к методу может потребовать дополнительной работы, в частности, когда метод имеет аргументы передачи по ссылке или использует блоки.

    Доступ к глобальным переменным и функциям C возможен, но также требует дополнительной работы, поскольку PyObjC не может прочитать их из API-интерфейса времени выполнения ObjC.Документация PyObjC содержит информацию о том, как получить к ним доступ, если они вам нужны.

  3. Настройка связей между частями Python и ObjC вашего кода.Я бы создал объекты Python в Python, а затем добавил API-интерфейсы ObjC (используя PyObjC), чтобы передать их в код ObjC для приложения.

    Чтобы получить лучший опыт на стороне ObjC, вам необходимо определить протоколы в ObjC, которые будут реализованы с помощью кода Python.

И заключительное примечание: Всеэто для доступа к API Objective-C из Python, а не из Swift.Это также должно работать с кодом Swift, но только если вы реализуете интерфейсы ObjC в swift (@objc).PyObjC нельзя использовать для доступа к произвольным быстрым API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...