cx_freeze 和 pycrypto 缺少模块?

0 投票
1 回答
875 浏览
提问于 2025-04-18 06:36

这是我为Python 3.3准备的setup.py文件:

#/usr/bin/env python3
import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
    "packages": [
        "os","io","copy","struct","hashlib","random",
        "urllib","pycurl","json","Crypto"
    ],
    "includes": [        "urllib.parse",    ],
    "excludes": ["tkinter"],
    "icon":"backup.ico"
}

setup(  name = "BlindBackup",
        version = "1.0",
        description = "BlindBackup client",
        options = {"build_exe": build_exe_options},
        executables = [Executable("backup.py", base=None)])

我可以执行“py -3 setup.py build_exe”,但是生成的exe文件无法正常工作。当我启动生成的backup.exe时,出现了这个错误信息:

ImportError: No module named 'Crypto.Cipher'; Crypto is not a package

但是,Crypto是一个包啊!我也尝试把这些添加到包含的部分:

    "includes": ["urllib.parse",
                 "Crypto","Crypto.Cipher","Crypto.Cipher.AES",],

但这样我甚至连exe都无法构建:

 File "C:\Python33\lib\site-packages\cx_Freeze\dist.py", line 362, in setup
   distutils.core.setup(**attrs)
 File "C:\Python33\lib\distutils\core.py", line 148, in setup
   dist.run_commands()
 File "C:\Python33\lib\distutils\dist.py", line 929, in run_commands
   self.run_command(cmd)
 File "C:\Python33\lib\distutils\dist.py", line 948, in run_command
   cmd_obj.run()
 File "C:\Python33\lib\site-packages\cx_Freeze\dist.py", line 232, in run
   freezer.Freeze()
 File "C:\Python33\lib\site-packages\cx_Freeze\freezer.py", line 603, in Freeze

   self.finder = self._GetModuleFinder()
 File "C:\Python33\lib\site-packages\cx_Freeze\freezer.py", line 343, in _GetMouleFinder
   finder.IncludeModule(name)
 File "C:\Python33\lib\site-packages\cx_Freeze\finder.py", line 678, in IncludeModule
   namespace = namespace)
 File "C:\Python33\lib\site-packages\cx_Freeze\finder.py", line 386, in _ImportModule
   raise ImportError("No module named %r" % name)
ImportError: No module named 'Crypto.Cipher'

这真让人困惑,因为确实有一个叫做Crypto.Cipher的模块。

你可以用python 3测试同样的setup.py脚本,只需创建一个backup.py脚本,然后把这个放进去:

from Crypto.Cipher import AES

有人建议我安装预编译的voidspace模块(参见使用pycrypto时cx_freeze结果执行错误),但这也不管用。我不想在一个7个月前的问题下评论,也许我应该这么做?无论如何,我现在遇到这个问题,自己无法解决。请帮帮我!

1 个回答

0

好吧,我之前有点傻。我在我的项目里创建了一个叫“crypto.py”的模块。确实,在Linux系统下,这个模块是不同的。但是在Windows系统下,包“Crypto”和模块“crypto”看起来是一样的。cx_Freeze搞混了它们,试图在这个名为crypto.py的“包”里找Cipher模块,而实际上它只是一个模块。

我把我的模块改了个名字,现在一切都正常了!

撰写回答