无法在Linux上使用pyinstaller和cefpython创建可执行文件ICU数据的无效文件描述符

问题描述

我有一些简单的cefpython代码打开一个网址,并尝试使用pyinstaller创建一个独立的可执行文件:

我将文件从https://github.com/cztomczak/cefpython/tree/master/examples/pyinstaller复制到了名为pyinstaller的目录中

我对pyinstaller.spec作了以下细微改动

+SECRET_CIPHER = ""
...
-    ["../wxpython.py"],+    ["../hello.py"],...
-          icon="../resources/wxpython.ico")
+          )
 

我可以使用python在Windows上成功编译我的应用程序 在具有python 3.5.4 64位和以下virtualenv的同一台计算机上:

cefpython3==66.0
future==0.18.2
PyInstaller==3.2.1
pypiwin32==223
pywin32==228

我还可以使用python 3.6.4 64及以下virtualenv编译Windows:

altgraph==0.17
cefpython3==66.0
future==0.18.2
macholib==1.14
pefile==2019.4.18
PyInstaller==3.3.1
pyinstaller-hooks-contrib==2020.9
pypiwin32==223
pywin32==228
pywin32-ctypes==0.2.0

在Linux上编译也可以,但是可执行文件无法运行。

我得到以下输出和错误:

CEF Python 66.0
Chromium 66.0.3359.181
CEF 3.3359.1774.gd49d25f
Python 3.5.2 64bit
[1013/180954.001980:ERROR:icu_util.cc(133)] Invalid file descriptor to ICU data received.
Trace/breakpoint trap (core dumped)

版本是python 3.5.2 64位,而virtualenv是:

cefpython3==66.0
pkg-resources==0.0.0
PyInstaller==3.2.1

可能是什么原因?

我尝试编译的代码如下:

import platform
import sys
from cefpython3 import cefpython as cef


def check_versions():
    ver = cef.GetVersion()
    print("CEF Python {ver}".format(ver=ver["version"]))
    print("Chromium {ver}".format(ver=ver["chrome_version"]))
    print("CEF {ver}".format(ver=ver["cef_version"]))
    print("Python {ver} {arch}".format(
           ver=platform.python_version(),arch=platform.architecture()[0]))
    assert cef.__version__ >= "57.0","CEF Python v57.0+ required to run this"


def main(url="https://www.stackoverflow.com"):
    sys.excepthook = cef.ExceptHook
    check_versions()
    settings = {}
    switches = {}
    browser_settings = {}
    cef.Initialize(settings=settings,switches=switches)
    cef.CreateBrowserSync(
        url=url,window_title="CEF_HELLO: ",settings=browser_settings,)
    cef.MessageLoop()
    cef.Shutdown()


if __name__ == "__main__":
    main()

附录:2020-10-14:

与其他版本的Linux上的相同错误: 到目前为止,我尝试了python 3.5和3.7

有人成功创建了可执行文件吗? 我可能只是示例项目及其配置的问题?

解决方法

作为替代方案,可以在 PyInstaller bug 5400 中找到解决方案 步骤如下:

1- 从以下位置下载名为 hook-cefpython3.py 的 CEFpython 中的 PyInstaller 助手: https://github.com/cztomczak/cefpython/tree/master/examples/pyinstaller 并放入项目的根目录

2- 在该文件中,替换该行:

from PyInstaller.compat import is_win,is_darwin,is_linux,is_py2

与:

from PyInstaller.compat import is_win,is_linux
is_py2 = False

3- 在您的 PyInstaller .spec 文件中,将 '.' 添加到 hookspath,例如hookspath=['.']。我认为也可以将其添加为 PyInstaller 命令行选项。

这些步骤应该可以解决问题,直到 CEFPython 提供正确版本的钩子文件。

,

这并不是我真正想接受的答案,但它至少是一个解决方案,其中包含一些信息,这些信息可能会导致更好的解决方案和更好的答案。

使用strace调试后,我发现可执行文件搜索了许多文件,例如搜索了icudtl.datv8_context_snapshot.binlocales/* 'dist / cefapp / cefpython3 but were copied to dist / cefapp /`

编译后要进行以下丑陋的工作

cd dist/cefapp/cefpython3
ln -s ../* .

可执行文件起作用。

我确定还有更好的非暴力解决方案,但是暂时我想回答,以防其他人陷入困境

这可能可以在规格文件中解决,但是我们是否需要一个用于Linux的规格文件和一个用于Windows的规格文件? 也许还有一个选项可以告诉可执行文件以更高的级别搜索这些文件?

,

要解决这个问题,您需要在您的规范文件中进行设置:

hookspath=[r'YOUR_ENV_SITE_PACKAGES\cefpython3\examples\pyinstaller\']

然后重建,你就会把东西放在正确的地方。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...