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

3 投票
1 回答
4084 浏览
提问于 2025-04-17 02:04

我正在尝试把一个Python脚本打包成一个可以在Windows机器上运行的exe文件,这样就不需要安装Python了。我使用的是Windows 7,我的应用程序用到了pywin32,而启动器是一个叫做console.py的文件,它需要一些命令行参数来执行另一个脚本。

我创建了一个setup.py文件,然后运行了命令python setup.py build,使用的是下面这个setup文件:

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的情况下运行build。因此我把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 个回答

2

试着包含 win32com.gen_py 这个包。

你可以查看一下创建的压缩包,看看里面是否有这个目录(或者像你做的那样,在一切正常之前不要压缩)。

改成下面这样:

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

撰写回答