首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MAC上使用PY2APP打包keyring模块时出错

在MAC上使用PY2APP打包keyring模块时出错
EN

Stack Overflow用户
提问于 2013-11-08 19:35:25
回答 3查看 911关注 0票数 6

我正在用python制作一个需要存储密钥的应用程序。我使用keyring模块来存储密钥。我使用的是python-2.7和OSX10.8.5以及keyring 3.2( easy_install keyring)。代码在eclipse上运行良好,但当我使用py2app将代码转换为应用程序时,它显示了MYAPP错误打开控制台终止错误

代码语言:javascript
复制
import keyring
keyring.set_password("title","section","keys")
res= keyring.get_password("title","section")

在通过py2app创建dist时,我在输入"python setup.py py2app“时包含了终端响应碎片。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2015-03-08 11:24:59

我不确定你是否解决过这个问题,但我在我的Mac上遇到了类似的问题(使用pythonv2.7.6和py2app v0.9):脚本从命令行(即python scriptname.py)运行得很好,但当我使用py2app将其转换为.app时,它失败了。

控制台消息使我得出结论,py2app还不够聪明,不能包含keyring.backends模块中的子模块。因此,我显式地将所有内容都导入到那里,它终于起作用了:

代码语言:javascript
复制
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

我希望这对你有帮助!

票数 1
EN

Stack Overflow用户

发布于 2013-11-18 19:12:53

我没有可能在本地尝试,以下是我最好的猜测:

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

代码语言:javascript
复制
import keyring
import keyring.set_password as _unused_1
import keyring.backend
import keyring.backend.PasswordSetError as _unused_2

在运行时,您可能还需要一些其他包,以进行检查,请执行以下操作:

代码语言:javascript
复制
$ 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
EN

Stack Overflow用户

发布于 2015-03-09 13:46:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19858161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档