pyinstaller 使用 --onefile 不打包 pyd 和 dll 文件

3 投票
1 回答
3975 浏览
提问于 2025-04-18 18:22

我正在尝试使用 cefpython1 把一个应用打包成一个单独的exe文件,使用的是pyinstaller。现在我有一个可以工作的spec文件,它能为cefpython1的示例程序cefsimple创建一个发行版:

# -*- mode: python -*-

def get_cefpython_path():
    import cefpython1 as cefpython

    path = os.path.dirname(cefpython.__file__)
    return "%s%s" % (path, os.sep)

cefp = get_cefpython_path()

a = Analysis(['cefsimple.py'],
             hiddenimports=["json.decoder", "json.scanner", "json.encoder"])
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='cefsimple.exe',
          debug=False,
          strip=None,
          upx=False,
          console=False )
coll = COLLECT(exe,
               a.binaries + [('icudt.dll', '%s/icudt.dll' % cefp, 'BINARY')],
               a.zipfiles,
               a.datas + [('locales/en-US.pak', '%s/locales/en-US.pak' % cefp, 'DATA'), ('cefsimple.html', 'cefsimple.html', 'DATA'), ('icon.ico', 'icon.ico', 'DATA')],
               strip=None,
               upx=False,
               name='cefsimple')

项目文件可以在我的 Google Drive 上找到。你可以忽略setup.py,它里面有一个我在玩py2exe的构建,和pyinstaller一起使用。要运行这个,你需要Python 2.7、Win32gui、cefpython1,当然还有pyinstaller这些包。我只在Win32版本上测试过!我甚至尝试安装了开发版的pyinstaller,看看是否会有变化。

当我尝试用--onefile参数执行pyinstaller时,似乎没有任何变化,pyinstaller只是创建了一个名为dist的发行目录。我使用的命令是:pyinstaller --onefile cefsimple.spec

我用一个简单的Hello World的python文件测试过--onefile,结果是可以的。那么是什么原因导致pyinstaller没有创建一个单独的exe文件呢?构建日志没有显示任何有趣的内容,但在警告文件中有一些我不太理解的东西。例如,它说没有名为cefpython1.cefpython的模块,但正确的pyd文件已经复制到dist目录,并且应用程序依然可以正常工作。

这是在dist/目录下创建的文件列表:cefsimple.lst 也许这能帮助找到问题所在。

1 个回答

1

我使用的命令是:pyinstaller --onefile cefsimple.spec

我用一个简单的“你好,世界”的Python文件测试了--onefile,确实可以正常工作。那么,是什么原因导致pyinstaller没有生成一个单独的exe文件呢?

当你输入pyinstaller --onefile cefsimple.spec时,--onefile这个选项会被忽略,因为.spec文件已经定义了你会得到一个文件夹还是一个独立的文件。如果.spec文件里有COLLECT这个功能,它会生成一个完整的dist文件夹。

我建议你重新创建一个新的.spec文件,可以通过输入pyi-makespec --onefile cefsimple.py来实现,然后把你之前的各种修改(比如数据、二进制文件、隐藏导入等)加回来,然后尝试输入pyinstaller cefsimple.spec,不加任何选项。这样在我使用pyinstaller 3.3.1时是有效的。

撰写回答