passlib.hash import sha256_crypt在使用 py2exe 编译时出错



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

最新更新