【问题标题】:passlib.hash import sha256_crypt gives error when compiled with py2exepasslib.hash import sha256_crypt 使用 py2exe 编译时出错
【发布时间】:2013-10-24 04:25:30
【问题描述】:

我有一个用 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.5\Lib\site-packages 下创建的,但是没有名为 passlib/hashsha_256 的文件。

【问题讨论】:

    标签: python encryption hash sha256 pycrypto


    【解决方案1】:

    Eli Collins 实际上是正确的,并为我指明了正确的方向。

    您可以通过更具体地键入导入来解决您的问题。 我通过将导入更改为如下所示解决了我的sha512 问题

    from passlib.handlers.sha2_crypt import sha512_crypt
    

    我的py2exe 分发现在运行良好。

    我知道这对你来说有点晚了,但它仍然可能对某人有所帮助,就像它帮助了我一样。感谢您提出问题,也感谢 Eli!

    【讨论】:

    • 我遇到了与 OP 相同的问题,并以与您相同的方式进行了修复。但我仍然想知道为什么来自 passlib.hash import sha256_crypt 的语句不起作用。
    【解决方案2】:

    为了只加载已明确请求的哈希,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"],
                }
        }
    )
    

    【讨论】:

    • 我曾尝试这样做,但现在 py2exe 失败了,因为它无法导入 passlib。
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多