2

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

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

当我使用以下方法编译此程序时,会出现我的问题py2exe

ImportError: No module named passlib.hash

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

from passlib.hash import sha256_crypt

有时我会看到一条警告说没有sha256_crypt在 GUI 中命名的模块,但程序仍然可以正常运行。

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

4

2 回答 2

3

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

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

from passlib.handlers.sha2_crypt import sha512_crypt

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

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

于 2015-06-23T11:49:43.453 回答
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"],
            }
    }
)
于 2013-10-28T16:14:36.440 回答