Модуль связки ключей не включен, упаковывая с py2exe
Я делаю приложение, используя Python 2.7 на Windows и Keyring-3.2.1. В моем коде Python на затмении я использовал
import keyring
keyring.set_password("service","jsonkey",json_res)
json_res= keyring.get_password("service","jsonkey")
работает нормально, так как я храню JSON-ответ в связке ключей. Но когда я конвертировал код Python в exe с помощью py2exe, он показывает ошибку импорта ключей во время выполнения dist. Подскажите пожалуйста как включить keyring в py2exe.
Traceback (most recent call last):
File "APP.py", line 8, in <module>
File "keyring\__init__.pyc", line 12, in <module>
File "keyring\core.pyc", line 15, in <module>
File "keyring\util\platform_.pyc", line 4, in <module>
File "keyring\util\platform.pyc", line 29, in <module>
AttributeError: 'module' object has no attribute 'system'
код платформы:
from __future__ import absolute_import
import os
import platform
def _data_root_Windows():
try:
root = os.environ['LOCALAPPDATA']
except KeyError:
# Windows XP
root = os.path.join(os.environ['USERPROFILE'], 'Local Settings')
return os.path.join(root, 'Python Keyring')
def _data_root_Linux():
"""
Use freedesktop.org Base Dir Specfication to determine storage
location.
"""
fallback = os.path.expanduser('~/.local/share')
root = os.environ.get('XDG_DATA_HOME', None) or fallback
return os.path.join(root, 'python_keyring')
# by default, use Unix convention
data_root = globals().get('_data_root_' + platform.system(), _data_root_Linux)
Код platform.py:
import os
import sys
# While we support Python 2.4, use a convoluted technique to import
# platform from the stdlib.
# With Python 2.5 or later, just do "from __future__ import absolute_import"
# and "import platform"
exec('__import__("platform", globals=dict())')
platform = sys.modules['platform']
def _data_root_Windows():
try:
root = os.environ['LOCALAPPDATA']
except KeyError:
# Windows XP
root = os.path.join(os.environ['USERPROFILE'], 'Local Settings')
return os.path.join(root, 'Python Keyring')
def _data_root_Linux():
"""
Use freedesktop.org Base Dir Specfication to determine storage
location.
"""
fallback = os.path.expanduser('~/.local/share')
root = os.environ.get('XDG_DATA_HOME', None) or fallback
return os.path.join(root, 'python_keyring')
# by default, use Unix convention
data_root = globals().get('_data_root_' + platform.system(), _data_root_Linux)
1 ответ
Проблема, о которой вы сообщаете, связана со средой, содержащей недопустимые модули, возможно, из-за неправильной установки одной версии связки ключей над другой. Вы хотите убедиться, что вы удалили остатки старой версии связки ключей. В частности, убедитесь, что в ваших пакетах сайта нет файла keyring \ util \ platform. *.
Однако после этого вы столкнетесь с другой проблемой. Keyring загружает свои внутренние модули программно, поэтому py2exe не обнаружит их.
Чтобы обойти это, вы захотите добавить объявление "packages" в ваши параметры py2exe, чтобы специально включить keyring.backends
пакет. Я применил следующее setup.py
скрипт с Python 2.7 для преобразования 'app.py' (который импортирует keyring) в exe:
from distutils.core import setup
import py2exe
setup(
console=['app.py'],
options=dict(py2exe=dict(
packages='keyring.backends',
)),
)
Полученный app.exe импортирует и вызывает брелок.