cx_freeze 和 pycrypto 缺少模块?
这是我为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模块,而实际上它只是一个模块。
我把我的模块改了个名字,现在一切都正常了!