如何解决无法在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.dat
,v8_context_snapshot.bin
,locales/*
'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\']
然后重建,你就会把东西放在正确的地方。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。