如何在使用 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 冻结成可执行文件后如何知道当前文件路径?

使用 cx_Freeze 冻结时不显示主窗口图标

使用 cx_freeze 冻结 py 脚本时的问题

ImportError:在使用 cx_Freeze 冻结的应用程序中导入 win32clipboard 时,DLL 加载失败