我有一个用Python编写的代码,在这里我使用passlib.hashsha256_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/hashsha_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"],
            }
    }
)

10-02 00:05