我有一个用Python编写的代码,在这里我使用passlib.hash
,sha256_crypt
散列密码,然后使用同一个库验证密码。
我能够使用控制台运行代码,即使用.py
。
当我使用py2exe
编译此程序时,会出现问题:
ImportError: No module named passlib.hash
我正在使用以下命令导入模块:
from passlib.hash import sha256_crypt
有时我会看到一个警告,说GUI中没有名为
sha256_crypt
的模块,但程序仍然正常运行。我正在使用Windows7,找不到解决此问题的任何方法。我已经检查了python主目录,似乎在安装passlib-1.6.1时,
passlib-1.6.1-py2.7.egg
文件是在C:\Python2.7.5\Lib\site-packages
下创建的,但是没有名为passlib/hash
或sha_256
的文件。 最佳答案
为了只加载显式请求的哈希器,Passlib玩了一个动态导入技巧:passlib.hash
实际上是一个特殊的对象,它只在请求时导入每个哈希器类。。。真正的hasher类实际上存储在passlib内部包passlib.handlers
中的模块中(特别是passlib.hash:sha256_crypt
实际上存储在passlib.handlers.sha2_crypt:sha256_crypt
下)。
另一方面,Py2exe尝试变得更聪明,尝试遍历应用程序的导入树,只绑定实际加载的模块。我发现每当它遇到一个python包,并使用动态导入技巧(如上所述)时,它经常(而且可以理解)出错。最后,py2exe打包的应用程序提供了奇怪且难以追踪的导入错误。
我不确定这会解决您的问题,但我知道最简单的解决方案是告诉py2exe包含整个passlib
包,而不必费心去“猜测”应该包含哪些部分。这可以通过在py2exe的"passlib"
选项中添加packages
来完成。。。
setup(
# ... other stuff ...
options={
"py2exe":{
# ... other stuff ...
"packages": ["passlib"],
}
}
)