我有一个用Python编写的代码,我使用passlib.hash
,sha256_crypt
哈希密码,然后使用相同的库验证密码。
我能够使用控制台运行代码,即使用 .py
.
当我使用 py2exe
编译此程序时,我的问题会出现:
ImportError: No module named passlib.hash
我正在使用以下命令导入模块:
from passlib.hash import sha256_crypt
有时我会看到一条警告,说 GUI 中没有名为 sha256_crypt
的模块,但程序仍然正常运行。
我使用的是Windows 7,找不到此问题的任何解决方案。我已经检查了我的python主目录,似乎在安装passlib-1.6.1时,passlib-1.6.1-py2.7.egg
文件是在C:Python2.7.5Libsite-packages
下创建的,但是没有名为passlib/hash
或sha_256
的文件。
Eli Collins实际上是对的,并为我指出了正确的方向。
您可以通过更具体地键入导入来解决问题。我通过将导入更改为如下所示来解决sha512
问题
from passlib.handlers.sha2_crypt import sha512_crypt
我的py2exe
发行版现在运行良好。
我知道这对你来说有点晚了,但它仍然可能会帮助某人,就像它帮助了我一样。为提出问题而致敬,也为伊莱点赞!
为了只加载显式请求的哈希器,Passlib 玩了一个动态导入技巧:passlib.hash
实际上是一个特殊的对象,它只在请求时导入每个哈希类......真正的哈希类实际上存储在 passlib 的内部包passlib.handlers
中的模块中(特别是passlib.hash:sha256_crypt
实际上存储在 passlib.handlers.sha2_crypt:sha256_crypt
下)。
另一方面,Py2exe 尝试变得聪明,并尝试遍历应用程序的导入树,并且只捆绑实际加载的模块。我发现每当它遇到 python 包拉动动态导入技巧(如上所述)时,它经常(并且可以理解)犯规。这最终导致py2exe打包的应用程序给出奇怪且难以追踪的导入错误。
我并不肯定这会解决您的问题,但我知道的最简单的解决方案是告诉 py2exe 包含整个passlib
包,而不是费心试图"猜测"应该包含哪些部分。这可以通过将"passlib"
添加到py2exe的packages
选项来完成...
setup(
# ... other stuff ...
options={
"py2exe":{
# ... other stuff ...
"packages": ["passlib"],
}
}
)