Доступ к константам и перечислениям API-объектов в Python - PullRequest
1 голос
/ 05 ноября 2010

Я использую 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

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

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

1 Ответ

1 голос
/ 12 марта 2011

Поставляемый Apple PyObjC предшествует некоторым дополнениям, которые были сделаны в Какао в 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 (которая будет содержать эти изменения и другие) и использовать ее.

...