如何将cefpython编译为exe文件

3
我正在使用cefpython创建一个简单的基于HTML5的应用程序。我使用Python和pywin32绘制一个简单的窗口,并在其中呈现框架。

我想将我的.py编译为一个.exe,但是我不知道该如何做。我尝试了使用py2exe,但运行结果时出现了错误。

Traceback (most recent call last):
  File "myApp.py", line 19, in <module>
  File "cefpython1\__init__.pyc", line 4, in <module>
ImportError: cannot import name cefpython_py27

我尝试将 cefpython_py27.pyd 复制到分发目录中,但似乎没有什么效果。

有人能帮帮我吗?这样做可行吗?

谢谢。

4个回答

4

在hidetr的答案基础上,将以下内容添加到setup.py中将复制所需的文件:

def get_cefpython_path():
    import cefpython1 as cefpython

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

def get_data_files():
    cefp = get_cefpython_path()
    data_files = [('', ['%s/icudt.dll' % cefp,
          '%s/d3dcompiler_43.dll' % cefp,
          '%s/d3dx9_43.dll' % cefp,
          '%s/devtools_resources.pak' % cefp,
          '%s/ffmpegsumo.dll' % cefp,
          '%s/libEGL.dll' % cefp,
          '%s/libGLESv2.dll' % cefp,
          '%s/Microsoft.VC90.CRT.manifest' % cefp,
          '%s/msvcm90.dll' % cefp,
          '%s/msvcp90.dll' % cefp,
          '%s/msvcr90.dll' % cefp]),
        ('locales', ['%s/locales/en-US.pak' % cefp]),
        ]
    return data_files

setup(
    data_file = get_data_files()
    ...

太棒了!我会试一下。 - Andrei Nemes
尝试这个,但仍然出现错误:import cefpython_py27 as cefpython。 - Harry

4
这是适用于Python 2.7 Win32的成功方法。我使用了cefpthon示例文件夹中的cefsimple.py示例进行演示。您需要先安装win32gui模块才能使此示例正常工作。
  • 下载并安装了cefpython1软件包。
  • 将cefsimple.html、cefsimple.py、cefwindow.py和icon.ico从cefpthon示例目录复制到一个单独的目录中,并修改cefsimple.py,只需导入cefpython:from cefpython1 import cefpython。基于__file__的模块检测在py2exe内部不起作用,会导致错误,因此我已将其删除(也许有更好的解决方法)。
  • 在包含上述复制文件的文件夹中创建以下setup.py:

    from setuptools import setup
    import py2exe
    import os

    def get_cefpython_path():
        import cefpython1 as cefpython

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

    def get_data_files():
        cefp = get_cefpython_path()
        data_files = [('', [
              '%s/icudt.dll' % cefp,
              '%s/d3dcompiler_43.dll' % cefp,
              '%s/d3dx9_43.dll' % cefp,
              '%s/devtools_resources.pak' % cefp,
              '%s/ffmpegsumo.dll' % cefp,
              '%s/libEGL.dll' % cefp,
              '%s/libGLESv2.dll' % cefp,
              '%s/Microsoft.VC90.CRT.manifest' % cefp,
              '%s/msvcm90.dll' % cefp,
              '%s/msvcp90.dll' % cefp,
              '%s/msvcr90.dll' % cefp,
              'icon.ico', 'cefsimple.html']),
            ('locales', ['%s/locales/en-US.pak' % cefp]),
            ]
        return data_files

    setup(
        data_files = get_data_files(),
        windows=['cefsimple.py'],
        options={
            "py2exe": {
                "includes": ["json", "urllib"]
            }
        }
    )
  • 然后只需在目录中运行以下py2exe命令:python setup.py py2exe
  • 现在您可以使用dist/cefsimple.exe运行生成的应用程序

您可以从我的Google Drive获取此示例的文件。


4

我最终成功地通过以下步骤来解决问题(我使用的是Python2.7):

我这样导入cefpython:

from cefpython1 import cefpython_py27 as cefpython

我的py2exe提示找不到python32.dll,因为我比较懒,不想破坏__ini__文件并搜索导入位置,所以我只是在设置文件的选项中添加了python32.dll到dll_excludes。在py2exe完成后,我还需要手动将这些文件夹和文件复制到我的dist文件夹中:

- C:\Python27(your python path)\Lib\site-packages\cefpython1\locales - whole folder
- C:\Python27(your python path)\Lib\site-packages\cefpython1\icudt.dll

需要注意的是,dll文件相对较大: icudt.dll = 9.8MB, libcef.dll = 24.3MB,因此不要期望dist文件夹大小很小。


这很有帮助,但现在我得到了wx.version=2.8.12.1 (msw-unicode) [0808/130201:ERROR:child_process_launcher.cc(326)] 无法启动子进程。 - Sid Kshatriya
以上问题可以通过复制subprocess.exe文件来解决(感谢cefpython的创建者Czarek提供的提示)。确保cefpython3文件夹中的其他文件,如cef.pak等、ffmpegsumo.dll等也被复制。 - Sid Kshatriya

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接