Доступ к константам и перечислениям API-объектов в Python

1

Я использую pyobjc, чтобы добавить некоторые необходимые функциональные возможности OSX к некоторому случайному программному обеспечению python. Мне нужно будет получить доступ к API-константам objc-land из python-land.

Пример таких констант лежит далеко внизу на странице NSRunningApplication, в частности три возможных значения NSApplicationActivationPolicy.

Для контекста текущая задача заключается в том, что в настоящее время запущены приложения, ориентированные на пользователя. С этой целью следующий код работает очень хорошо:

from Foundation import *
from Cocoa import *
import objc

for runningApp in sorted(
                     NSWorkspace.sharedWorkspace().runningApplications(),
                     key=lambda x: x.localizedName()
                  ):
    if runningApp.activationPolicy() == 0:
        # Do stuff

Но я бы предпочел не проверять на нуль (чтобы сделать его более удобочитаемым), ни hardcode фиктивное значение NSApplicationActivationPolicyRegular до нуля в моем собственном коде, когда оно легко доступно в исходной библиотеке.

Как я могу получить доступ к таким константам objc из python через pyobjc?

Теги:
enums
constants
pyobjc

1 ответ

1
Лучший ответ

поставляемый Apple PyObjC предшествует некоторым дополнениям, которые были сделаны к Cocoa в 10.6. NSRunningApplication является одним из этих дополнений, поэтому PyObjC об этом не знает. Вам нужно добавить некоторые метаданные в файл AppKit BridgeSupport по адресу:/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport

Эти три строки будут охватывать enum, который вы пытаетесь использовать.

<enum name='NSApplicationActivationPolicyRegular' value='0' />
<enum name='NSApplicationActivationPolicyAccessory' value='1' />
<enum name='NSApplicationActivationPolicyProhibited' value='2' /> 

Обратите внимание, что изменение PyObjC, как это, вероятно, означает, что вам придется статически связывать и включать вашу обновленную версию в ваше приложение для распространения, потому что версия на всех остальных машинах не будет иметь этих данных. Может быть лучше всего скомпилировать новейшую версию PyObjC (которая будет содержать эти изменения плюс другие) и использовать ее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню