8

Windows で python 2.7 と keyring-3.2.1を使用してアプリを作成しています。日食の私のpythonコードでは、私は使用しました

import keyring
keyring.set_password("service","jsonkey",json_res)
json_res= keyring.get_password("service","jsonkey")

キーリングにjson応答を保存しているため、正常に動作しています。しかし、py2exeを使ってpythonコードをexeに変換すると、distの作成中にキーリングのインポートエラーが表示されます。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'

platform_.py コードは次のとおりです。

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)
4

1 に答える 1

7

あなたが報告している問題は、おそらくあるバージョンのキーリングを別のバージョンに不適切にインストールしたために、無効なモジュールを含む環境が原因です。古いバージョンのキーリングの残りを確実に削除する必要があります。特に、サイト パッケージに keyring\util\platform.* というファイルがないことを確認してください。

ただし、それを行った後、別の問題が発生します。キーリングはバックエンド モジュールをプログラムでロードするため、py2exe はそれらを検出しません。

これを回避するには、'packages' 宣言を py2exe オプションに追加して、具体的にkeyring.backendsパッケージを含める必要があります。Python 2.7 で次のスクリプトを呼び出して、setup.py「app.py」(キーリングをインポートする) を exe に変換しました。

from distutils.core import setup
import py2exe

setup(
    console=['app.py'],
    options=dict(py2exe=dict(
        packages='keyring.backends',
    )),
)

結果の app.exe は、キーリングをインポートして呼び出します。

于 2013-12-02T14:12:04.247 に答える