使用 Python 3.2 和 cx_Freeze 创建 Windows 可执行文件

Posted

技术标签:

【中文标题】使用 Python 3.2 和 cx_Freeze 创建 Windows 可执行文件【英文标题】:Creating a Windows Executable with Python 3.2 & cx_Freeze 【发布时间】:2011-09-12 00:44:09 【问题描述】:

所以我试图将 python 脚本打包成一个 exe,它可以在 Windows 机器上运行而无需安装 python。我正在运行 WIn7 并且我的应用程序使用 pywin32 并且启动器是一个名为 console.py 的文件,它接受几个命令行参数并执行另一个脚本

我创建了一个 setup.py 文件,我在该文件上运行了 python setup.py build,并带有以下设置文件

from cx_Freeze import setup, Executable

setup(
    name = "OneNote Email Notifications",
    version = "0.1",
    description = "An email notifier for OneNote",
    executables = [Executable("console.py")]
    )

返回以下错误,

Traceback (most recent call last):
  File "C:\Python32\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 2
7, in <module>
    exec(code, m.__dict__)
  File "console.py", line 1, in <module>
  File "C:\Users\Varun\Desktop\My Dropbox\OnePy\OM\Notifications v0.2\notificati
ons.py", line 1, in <module>
    import application
  File "C:\Users\Varun\Desktop\My Dropbox\OnePy\OM\Notifications v0.2\applicatio
n.py", line 1, in <module>
    import ApplicationServer
  File "C:\Users\Varun\Desktop\My Dropbox\OnePy\OM\Notifications v0.2\Applicatio
nServer.py", line 5, in <module>
    win32com.client.gencache.Rebuild()
  File "C:\Python32\lib\site-packages\win32com\client\gencache.py", line 649, in
 Rebuild
    _SaveDicts()
  File "C:\Python32\lib\site-packages\win32com\client\gencache.py", line 65, in
_SaveDicts
    f = open(os.path.join(GetGeneratePath(), "dicts.dat"), "wb")
  File "C:\Python32\lib\site-packages\win32com\client\gencache.py", line 141, in
 GetGeneratePath
    f = open(fname,"w")
IOError: [Errno 2] No such file or directory: 'C:\\Users\\Varun\\Desktop\\My Dro
pbox\\OnePy\\OM\\Notifications v0.2\\build\\exe.win-amd64-3.2\\library.zip\\win3
2com\\gen_py\\__init__.py'

所以我认为读取 zip 文件可能存在问题,并决定在不创建 library.zip 的情况下运行构建。所以我将 setup.py 更改为

from cx_Freeze import setup, Executable

setup(
    name = "OneNote Email Notifications",
    version = "0.1",
    description = "An email notifier for OneNote",
    options = "build_exe": 
                                "create_shared_zip": False,
                                "append_script_to_exe": True,
                                "include_in_shared_zip": False,
                             
              ,
    executables = [Executable("console.py")]
)

现在我收到以下错误消息:

Traceback (most recent call last):
  File "C:\Python32\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 2
7, in <module>
    exec(code, m.__dict__)
  File "console.py", line 1, in <module>
  File "C:\Users\Varun\Desktop\My Dropbox\OnePy\OM\Notifications v0.2\notificati
ons.py", line 1, in <module>
    import application
  File "C:\Users\Varun\Desktop\My Dropbox\OnePy\OM\Notifications v0.2\applicatio
n.py", line 1, in <module>
    import ApplicationServer
  File "C:\Users\Varun\Desktop\My Dropbox\OnePy\OM\Notifications v0.2\Applicatio
nServer.py", line 5, in <module>
    win32com.client.gencache.Rebuild()
  File "C:\Python32\lib\site-packages\win32com\client\gencache.py", line 649, in
 Rebuild
    _SaveDicts()
  File "C:\Python32\lib\site-packages\win32com\client\gencache.py", line 65, in
_SaveDicts
    f = open(os.path.join(GetGeneratePath(), "dicts.dat"), "wb")
  File "C:\Python32\lib\site-packages\win32com\client\gencache.py", line 141, in
 GetGeneratePath
    f = open(fname,"w")
IOError: [Errno 2] No such file or directory: 'C:\\Users\\Varun\\Desktop\\My Dro
pbox\\OnePy\\OM\\Notifications v0.2\\build\\exe.win-amd64-3.2\\console.exe\\win3
2com\\gen_py\\__init__.py'

【问题讨论】:

【参考方案1】:

尝试包含 win32com.gen_py 包。

您始终可以查看创建的 zip 并查看该目录是否存在(或者像您所做的那样 - 在一切正常之前不要压缩)。

改为如下

#....
executables = [Executable("console.py", packages=[''win32com.gen_py])]
#....

【讨论】:

以上是关于使用 Python 3.2 和 cx_Freeze 创建 Windows 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

带有 cx_freeze 的 python 3.2 tkinter 图标

Python Pmw 和 cx_Freeze?

cx_Freeze 和 Python 3.4

cx_Freeze 和 Python 3.3

使用 cx_Freeze 将 Python 转换为 exe 时 Scipy 和 Cython 出现 AttributeError

Python cx_Freeze 错误“没有名为 'cx_Freeze.util' 的模块”