如何在使用 cx_Freeze 6.0b1 冻结的 Linux 上修复 python 3.7.3 脚本上的 numpy 依赖项路径?
Posted
技术标签:
【中文标题】如何在使用 cx_Freeze 6.0b1 冻结的 Linux 上修复 python 3.7.3 脚本上的 numpy 依赖项路径?【英文标题】:How to fix numpy dependencies path on a python 3.7.3 script on Linux frozen with cx_Freeze 6.0b1? 【发布时间】:2019-06-12 10:01:08 【问题描述】:我正在使用 Debian 9、python 3.7.3 和 cx_Freeze 6.0b1。我花了一些时间在 Windows 7 和 Debian 上安装 cx_Freeze,我设法在两个平台上编译了脚本。
当我共享它时,Windows 版本会运行,但 Linux 版本会引发有关缺少依赖项的错误。该应用程序仍在寻找绝对路径中的文件,我不明白为什么。
当我运行 cx_Freeze 时,.so
文件被复制到输出目录。
我编译的程序:
import numpy as np
import matplotlib.pyplot as plt
f=open('hello.txt','w')
f.write('Hello World')
f.close()
y=lambda x:np.sqrt(x)
x=range(10)
plt.plot(x,y(x))
plt.show()
我的setup.py
程序:
from cx_Freeze import setup, Executable
exclude = []
executables = [
Executable('hello.py', base=None, targetName='Hello')]
includes=["encodings"]
include_files=[]
includes=[]
packages=["numpy","matplotlib"]
setup(
name = "Hello",
version = "1 ",
description = "Hello World",
options = 'build_exe':"packages":packages, "include_files":include_files,'excludes':exclude,'includes':includes,
executables = executables
)
尝试在第二台计算机上执行应用程序时出错:
Traceback (most recent call last):
File "/home/ansart/anaconda3/lib/python3.7/site-packages/cx_Freeze/initscripts/__startup__.py", line 14, in run
File "/home/ansart/anaconda3/lib/python3.7/site-packages/cx_Freeze/initscripts/Console.py", line 26, in run
File "hello.py", line 1, in <module>
File "/home/ansart/anaconda3/lib/python3.7/site-packages/numpy/__init__.py", line 140, in <module>
File "/home/ansart/anaconda3/lib/python3.7/site-packages/numpy/_distributor_init.py", line 34, in <module>
ImportError: libmkl_rt.so: cannot open shared object file: No such file or directory
尝试在第三台计算机上执行应用程序时出错:
Traceback (most recent call last):
File "/home/ansart/anaconda3/lib/python3.7/site-packages/cx_Freeze/initscripts/__startup__.py", line 14, in run
File "/home/ansart/anaconda3/lib/python3.7/site-packages/cx_Freeze/initscripts/Console.py", line 26, in run
File "hello.py", line 1, in <module>
File "/home/ansart/anaconda3/lib/python3.7/site-packages/numpy/__init__.py", line 140, in <module>
File "/home/ansart/anaconda3/lib/python3.7/site-packages/numpy/_distributor_init.py", line 33, in <module>
File "/home/ansart/anaconda3/lib/python3.7/site-packages/numpy/_distributor_init.py", line 18, in __enter__
File "/home/ansart/anaconda3/lib/python3.7/ctypes/__init__.py", line 7, in <module>
ImportError: libffi.so.6: cannot open shared object file: No such file or directory
目录中的文件列表:
total 97649
-rwxrwxrwx 1 vansart 197121 3464464 juin 11 14:55 Hello
-rwxrwxrwx 1 vansart 197121 11 juin 11 17:28 hello.txt
drwxrwxrwx 1 vansart 197121 0 juin 12 08:33 imageformats/
drwxrwxrwx 1 vansart 197121 0 juin 12 08:33 lib/
-rwxrwxrwx 1 vansart 197121 840264 janv. 17 21:31 libblosc.so.1
-rwxrwxrwx 1 vansart 197121 3452736 juin 7 16:48 libcrypto.so.1.1
-rwxrwxrwx 1 vansart 197121 409720 juin 7 16:48 libdbus-1.so.3
-rwxrwxrwx 1 vansart 197121 225424 août 27 2018 libexpat.so.1
-rwxrwxrwx 1 vansart 197121 99936 janv. 19 19:34 libexslt.so.0
-rwxrwxrwx 1 vansart 197121 40864 nov. 8 2017 libffi.so.6
-rwxrwxrwx 1 vansart 197121 324384 juin 7 16:48 libfontconfig.so.1
-rwxrwxrwx 1 vansart 197121 778224 août 24 2018 libfreetype.so.6
-rwxrwxrwx 1 vansart 197121 819744 août 17 2018 libgcc_s.so.1
-rwxrwxrwx 1 vansart 197121 5925928 août 18 2018 libgfortran.so.4
-rwxrwxrwx 1 vansart 197121 1321984 juin 7 16:48 libglib-2.0.so.0
-rwxrwxrwx 1 vansart 197121 16200 août 28 2018 libgthread-2.0.so.0
-rwxrwxrwx 1 vansart 197121 4085608 juin 7 16:48 libhdf5.so.103
-rwxrwxrwx 1 vansart 197121 26215496 nov. 16 2017 libicudata.so.58
-rwxrwxrwx 1 vansart 197121 3227376 nov. 16 2017 libicui18n.so.58
-rwxrwxrwx 1 vansart 197121 2041320 nov. 16 2017 libicuuc.so.58
-rwxrwxrwx 1 vansart 197121 263880 nov. 9 2017 libjpeg.so.9
-rwxrwxrwx 1 vansart 197121 173408 mai 16 2018 liblzma.so.5
-rwxrwxrwx 1 vansart 197121 6628244 mars 14 21:00 libmkl_rt.so
-rwxrwxrwx 1 vansart 197121 272240 nov. 28 2018 libncursesw.so.6
-rwxrwxrwx 1 vansart 197121 296792 mars 12 20:41 libpcre.so.1
-rwxrwxrwx 1 vansart 197121 252920 janv. 11 20:20 libpng16.so.16
-rwxrwxrwx 1 vansart 197121 4270856 juin 7 16:48 libQt5Core.so.5
-rwxrwxrwx 1 vansart 197121 386744 déc. 12 09:48 libQt5DBus.so.5
-rwxrwxrwx 1 vansart 197121 519048 déc. 12 09:48 libQt5EglFSDeviceIntegration.so.5
-rwxrwxrwx 1 vansart 197121 3954056 déc. 12 09:48 libQt5Gui.so.5
-rwxrwxrwx 1 vansart 197121 1183672 déc. 12 09:48 libQt5Network.so.5
-rwxrwxrwx 1 vansart 197121 305760 déc. 12 09:48 libQt5Svg.so.5
-rwxrwxrwx 1 vansart 197121 5440440 déc. 12 09:48 libQt5Widgets.so.5
-rwxrwxrwx 1 vansart 197121 14640 déc. 12 09:48 libQt5X11Extras.so.5
-rwxrwxrwx 1 vansart 197121 971848 déc. 12 09:48 libQt5XcbQpa.so.5
-rwxrwxrwx 1 vansart 197121 864776 août 17 2018 libquadmath.so.0
-rwxrwxrwx 1 vansart 197121 372072 août 28 2018 libreadline.so.7
-rwxrwxrwx 1 vansart 197121 42336 nov. 27 2017 libsnappy.so.1
-rwxrwxrwx 1 vansart 197121 395472 mars 28 2018 libsodium.so.23
-rwxrwxrwx 1 vansart 197121 1233456 mars 12 20:13 libsqlite3.so.0
-rwxrwxrwx 1 vansart 197121 695960 mars 7 16:42 libssl.so.1.1
-rwxrwxrwx 1 vansart 197121 9536208 août 17 2018 libstdc++.so.6
-rwxrwxrwx 1 vansart 197121 1970968 juin 7 16:48 libtcl8.6.so
-rwxrwxrwx 1 vansart 197121 550704 janv. 28 21:29 libtiff.so.5
-rwxrwxrwx 1 vansart 197121 266064 juin 7 16:48 libtinfow.so.6
-rwxrwxrwx 1 vansart 197121 1580952 août 28 2018 libtk8.6.so
-rwxrwxrwx 1 vansart 197121 18472 janv. 11 2018 libuuid.so.1
-rwxrwxrwx 1 vansart 197121 215392 avr. 13 2018 libxcb.so.1
-rwxrwxrwx 1 vansart 197121 24552 avr. 13 2018 libxcb-dri2.so.0
-rwxrwxrwx 1 vansart 197121 23736 avr. 13 2018 libxcb-dri3.so.0
-rwxrwxrwx 1 vansart 197121 154312 avr. 13 2018 libxcb-glx.so.0
-rwxrwxrwx 1 vansart 197121 13784 avr. 13 2018 libxcb-present.so.0
-rwxrwxrwx 1 vansart 197121 34912 avr. 13 2018 libxcb-sync.so.1
-rwxrwxrwx 1 vansart 197121 45936 avr. 13 2018 libxcb-xfixes.so.0
-rwxrwxrwx 1 vansart 197121 1714896 janv. 19 16:11 libxml2.so.2
-rwxrwxrwx 1 vansart 197121 297000 juin 7 16:48 libxslt.so.1
-rwxrwxrwx 1 vansart 197121 133384 nov. 21 2018 libz.so.1
-rwxrwxrwx 1 vansart 197121 731928 févr. 1 13:16 libzmq.so.5
-rwxrwxrwx 1 vansart 197121 696896 nov. 6 2018 libzstd.so.1.3.7
-rwxrwxrwx 1 vansart 197121 0 juin 12 11:31 list.txt
drwxrwxrwx 1 vansart 197121 0 juin 12 08:33 mpl-data/
drwxrwxrwx 1 vansart 197121 0 juin 12 08:33 platforms/
【问题讨论】:
【参考方案1】:在分享前尝试手动将所有lib*.so.*
文件复制到冻结应用的lib
子目录中。这能解决你的问题吗?如果是,您可以在 setup.py
脚本末尾使用 shutil.copy2
自动执行此步骤。
关于您的评论:
app还在寻找绝对路径下的文件,不明白为什么
我猜你指的是出现在回溯中的路径。这些是附加到代码对象的文件名,可能在移动冻结的应用程序时不会实现。您可以通过添加条目让 cx_Freeze 通过相对路径替换这些绝对路径
'replace_paths': [("*", "")]
到setup.py
脚本中的build_exe
选项字典。请参阅 cx_Freeze 存储库上的 issue #247 及其中的链接。
【讨论】:
它不起作用。我将每个.so
文件复制到根和 lib 文件夹,它会引发相同的错误
@ansarto 您使用的是哪个版本的 numpy?
它是 numpy 1.16.2。我尝试使用 1.16.3,就像我的 windows 安装一样。它适用于某些计算机,但会引发其他错误我仍然缺少 numpy 的 libffi.so.6
文件,有时还有一些 matplotlib 文件。以上是关于如何在使用 cx_Freeze 6.0b1 冻结的 Linux 上修复 python 3.7.3 脚本上的 numpy 依赖项路径?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 cx_Freeze 冻结双模式(GUI 和控制台)应用程序?
使用 cx_Freeze 冻结 Python 3.7 脚本时如何修复错误
使用 cx_Freeze 冻结成可执行文件后如何知道当前文件路径?
ImportError:在使用 cx_Freeze 冻结的应用程序中导入 win32clipboard 时,DLL 加载失败