使用py2exe编译时,passlib.hash导入sha256_crypt会出错

时间:2013-10-16 06:51:27

标签: python encryption hash sha256 pycrypto

我有一个用Python编写的代码,我使用passlib.hashsha256_crypt对密码进行哈希处理,然后使用相同的库验证密码。

我可以使用控制台运行代码,即使用.py

使用py2exe编译此程序时出现问题:

ImportError: No module named passlib.hash

我使用以下命令导入模块:

from passlib.hash import sha256_crypt

有时我会看到一条警告,说明GUI中没有名为sha256_crypt的模块,但程序仍能正常运行。

我使用的是Windows 7,无法找到解决此问题的方法。我在安装passlib-1.6.1时检查了我的python主目录,在passlib-1.6.1-py2.7.egg下创建了C:\Python2.7.5\Lib\site-packages文件,但是没有名为passlib/hashsha_256的文件。

2 个答案:

答案 0 :(得分:2)

为了仅加载已明确请求的哈希,Passlib会播放动态导入技巧:passlib.hash实际上是一个特殊对象,只在请求时导入每个哈希类 。真正的hasher类实际上存储在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"],
            }
    }
)

答案 1 :(得分:2)

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

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

from passlib.handlers.sha2_crypt import sha512_crypt

我的py2exe发布现在效果非常好。

我知道这对你来说有点晚了,但它仍然可以帮助某人,就像它帮助了我一样。感谢你提出这个问题并赞扬了Eli!