首页 文章

在MAC OSX上使用PY2APP打包密钥环模块时出错

提问于
浏览
6

我在python中创建一个需要存储密钥的应用程序 . 我使用密钥环模块来存储密钥 . 我使用python-2.7和osx 10.8.5与密钥环3.2(easy_install密钥环) . 代码在eclipse上正常运行,但是当我使用py2app将代码转换为应用程序时,它显示错误的MYAPP错误打开控制台终止

import keyring
keyring.set_password("title","section","keys")
res= keyring.get_password("title","section")

我在键入“python setup.py py2app”时包含终端响应废料,同时通过py2app制作dist

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 回答

  • 1

    不确定你是否解决了这个问题,但我的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
    

    我希望这可以帮助你!

  • 0

    我没有办法在本地尝试这个,这是我最好的猜测:

    尝试导入应用程序中实际需要的所有位,包括在“正常”执行期间不会发生的异常

    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 打包一个普通或修改过的模块吗?

  • 0

    在setup.py中包含 packages='keyring.backends' 以包含密钥环的所有包 .

相关问题