Evt.TickCount() не найден с Python2.6 на OSX 10.6.3

В Python2.6 модуль Evt (из Carbon import Evt), похоже, не отвечает на TickCount() в OSX. Но Python2.5 в порядке:

from Carbon import Evt
s = Evt.TickCount()

На Python2.5 я получаю возвращаемое целое число. На Python2.6 я получаю:

AttributeError: 'module' object has no attribute 'TickCount'

Это на Снежном Барсе. Есть ли какая-то библиотека, которую необходимо обновить в OSX, чтобы TickCount() работал? У меня действительно возникла эта проблема из-за использования py2app.

Обновление для ответа Барри: Проблема в том, что приложение, которое создает py2app, при запуске дает мне:

  File "/Users/cybertoast/Projects/scripts/dist/fixcatalystlibs.app/Contents/Resources/__boot__.py", line 40, in mainloop
  [0x0-0x913913].org.pythonmac.unspecified.fixcatalystlibs[11722]       stoptime = Evt.TickCount() + timeout
  [0x0-0x913913].org.pythonmac.unspecified.fixcatalystlibs[11722]   AttributeError: 'module' object has no attribute 'TickCount'

Я добавил VERSIONER_PYTHON_PREFER_32_BIT=yes в свой .bash_profile, но приложение, которое создает py2app, по-прежнему имеет ту же проблему. Однако интерпретатор Python доволен 32-битным исправлением. Но все же нужно решение для py2app.


person cybertoast    schedule 11.08.2010    source источник


Ответы (4)


Поскольку сломанный код использовался только для эмуляции argv, я смог заставить свое приложение работать, отключив эмуляцию argv. Это можно сделать, установив для ключа argv_emulation в хеше OPTIONS py2app значение False.

Пример:

APP = ['MyApp.py']
OPTIONS = { 
   'argv_emulation': False,
   ...
}

setup(
    app=APP,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)
person David    schedule 27.11.2010

Код, который я использовал, требует использования argv_emulation, поэтому приведенные выше решения мне не помогли. В конце концов, я использовал LSArchitecturePriority в файле plist, установив для него значение i386. Это решило мою проблему и позволило сохранить для argv_emulation значение True.

Дополнительную информацию можно найти здесь: http://developer.apple.com/library/mac/#documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#/

person djbp    schedule 25.01.2012

Python по умолчанию работает в 64-битном режиме в Snow Leopard. Похоже, что Carbon.Evt не перешел на полную 64-битную совместимость. Вы можете убедиться в этом, попробовав запустить в 32-битном режиме (см. man python):

oso:~ barry$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
oso:~ barry$ python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import Carbon.Evt as evt
>>> evt.TickCount()
2973070
>>> 

Итак, либо запустите py2app в 32-битном режиме, либо сообщите нам, что вы пытаетесь сделать, и, возможно, мы сможем предоставить 64-битную совместимую альтернативу.

person Barry Wark    schedule 11.08.2010
comment
Обновил проблему на основе вашего ответа. Это полезно для интерпретатора, но не для py2app. - person cybertoast; 12.08.2010
comment
Я думаю, вы можете указать переменные среды в Info.plist приложения. Возможно, вы сможете установить VERSIONER_PYTHON_PREFER_32_BIT в plist приложения. Если нет, начните копаться в том, как py2app выбирает интерпретатор. - person Barry Wark; 12.08.2010
comment
На самом деле это не столько решение, сколько обходной путь, но в конце концов я остановился на Platypus, у которого не было этой проблемы. Я смог указать библиотеки, которые мне нужны, и созданный пакет отлично работает на других машинах (но я не тестировал это всесторонне, поэтому возможно, что проблемы с версией все еще будут). - person cybertoast; 12.10.2010
comment
После использования platypus в течение нескольких недель я стал его поклонником — до сих пор никаких проблем с версиями. - person cybertoast; 01.11.2010

Вероятно, самое простое решение — использовать другой, только 32-разрядный Python вместо поставляемого Apple в версии 10.6 — например, установить Python 2.6 с помощью установщик python.org. Если вы хотите распространять свое приложение как отдельное приложение, которое можно использовать в нескольких версиях OS X, вам все равно придется это сделать.

person Ned Deily    schedule 12.08.2010