Ошибка при упаковке модуля ключей с PY2APP на MAC OSX
Я делаю приложение на Python, которое должно хранить ключи. Я использовал модуль для хранения ключей. Я использую python-2.7 и osx 10.8.5 с keyring 3.2( easy_install keyring). На Eclipse код работает нормально, но когда я преобразовал код в приложение с помощью py2app, он показывает ошибку MYAPP Ошибка открытой консоли Завершение
import keyring
keyring.set_password("title","section","keys")
res= keyring.get_password("title","section")
Я включил вывод ответа терминала, когда набрал "python setup.py py2app" при создании dist через py2app
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/__init__.py to keyring/__init__.pyc
creating /Users/fis/Desktop/build/bdist.macosx-10.8-intel/python2.7-semi_standalone/app/collect/keyring
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/backend.py to keyring/backend.pyc
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/core.py to keyring/core.pyc
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/errors.py to keyring/errors.pyc
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/getpassbackend.py to keyring/getpassbackend.pyc
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/py27compat.py to keyring/py27compat.pyc
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/util/__init__.py to keyring/util/__init__.pyc
creating /Users/fis/Desktop/build/bdist.macosx-10.8-intel/python2.7-semi_standalone/app/collect/keyring/util
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/util/platform_.py to keyring/util/platform_.pyc
byte-compiling /Library/Python/2.7/site-packages/keyring-3.2-py2.7.egg/keyring/util/properties.py to keyring/util/properties.pyc
byte-compiling /Library/Python/2.7/site-packages/pathtools-0.1.2-py2.7.egg/pathtools/__init__.pyc to pathtools/__init__.pyc
creating /Users/fis/Desktop/build/bdist.macosx-10.8-intel/python2.7-semi_standalone/app/collect/pathtools
3 ответа
Не уверен, что вы когда-нибудь решили эту проблему, но у меня была похожая проблема на моем Mac (с python v2.7.6 и py2app v0.9): скрипт запускался нормально из командной строки (т.е. python scriptname.py
), но когда я использовал py2app
преобразовать его в .app
, это не удалось.
Сообщения консоли привели меня к выводу, что py2app
не был достаточно умен, чтобы включить подмодули из keyring.backends
модуль. Так что я явно импортировал все туда, и это, наконец, сработало:
import keyring.backends.file
import keyring.backends.Gnome
import keyring.backends.Google
import keyring.backends.kwallet
import keyring.backends.multi
import keyring.backends.OS_X
import keyring.backends.pyfs
import keyring.backends.SecretService
import keyring.backends.Windows
import keyring
Я надеюсь, это поможет вам!
Включите package ='keyring.backends' в setup.py, чтобы включить все пакеты ключей.
У меня нет возможности попробовать это на месте, вот мое лучшее предположение:
Попробуйте импортировать все биты, которые вам действительно нужны в приложении, включая исключения, которые не возникают во время "нормального" выполнения.
import keyring
import keyring.set_password as _unused_1
import keyring.backend
import keyring.backend.PasswordSetError as _unused_2
Вам также может потребоваться другой пакет во время выполнения, чтобы проверить это, сделайте следующее:
$ python2.7
Python 2.7.5 (default, Sep 6 2013, 09:55:21)
[GCC 4.8.1 20130725 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> before = sys.modules.keys()
>>> import keyring
>>> middle = sys.modules.keys()
>>> keyring.set_password("a", "b", "c")
Please set a password for your new keyring
Password:
Password (again):
Please input your password for the keyring
Password:
>>> after = sys.modules.keys()
#
# now the interesting bits
#
>>> set(after).difference(set(middle))
set(['struct', 'crypt', 'base64', 'binascii', 'keyring.crypt', 'encodings.base64', 'encodings.base64_codec', '_struct'])
#
# and this
#
>>> set(middle).difference(set(before))
set(['cStringIO', 'heapq', 'logging.threading', 'sre_compile', '_collections', 'logging.cStringIO', '_sre', 'getpass', 'atexit', 'keyring.backend', 'logging.os', 'operator', 'Crypto.Cipher.AES', 'logging.traceback', 'keyring.os', '_heapq', 'logging.time', 'keyring.ConfigParser', 'logging.weakref', 're', 'keyring.getpass', 'sre_constants', 'imp', 'logging.codecs', 'collections', 'logging.thread', 'keyring.imp', 'keyring.logging', 'keyring.keyring', 'string', 'keyring.util.re', 'time', 'Crypto', 'termios', 'keyring.util.escape', 'logging', 'logging.atexit', 'keyring.util', 'logging.sys', 'keyring.abc', 'Crypto.Cipher', 'ConfigParser', 'keyring.util.string', 'keyring.getpassbackend', 'keyword', 'thread', 'strop', 'traceback', 'keyring', 'weakref', 'threading', 'itertools', 'keyring.Crypto', 'keyring.sys', 'sre_parse', 'logging.warnings', 'keyring.core'])
Вы видите, сколько модулей было введено в результате import keyring
, но также были добавлены еще несколько модулей в результате keyring.set_password(...)
,
Теперь большая часть этого должна быть автоматическая с py2app
, но некоторые зависимости во время выполнения могут быть пропущены.
Причина этого заключается в том, что py2app
делает что-то хитрое, когда решает, какие модули включить. Притворись, что keyring.set_password()
на самом деле не работает на этом этапе. На самом деле, если бы это было и set_password
должны иметь побочные эффекты, вы ожидаете py2app
упаковать простой или модифицированный модуль?