【问题标题】:cx_Freeze package doesn't work on another machinecx_Freeze 包在另一台机器上不起作用
【发布时间】:2019-06-25 21:56:53
【问题描述】:

好的,我开发了一个 PySide 桌面应用程序,我想使用 cx_Freeze 来分享它。我在打包 paramiko 库时遇到了一些问题,但我使用这个 workaround 解决了。

一切都在我的机器上运行,这意味着双击由 cx_Freeze 生成的 .exe 应用程序正在启动并正常运行。

当我在朋友的 PC 上测试该软件包时,我感到非常失望。

应用程序未启动并显示此错误:

File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
  File "main_window.py", line 13, in <module>
  File "C:\Users\frpegora\Desktop\Projects\GUI\single_widget.py", line 13, in <module>
  File "C:\Users\frpegora\Desktop\Projects\GUI\importer_server.py", line 14, in <module>
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko\__init__.py", line 22, in <module>
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko\transport.py", line 90, in <module>
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko\ed25519key.py", line 20, in <module>
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\hazmat\backends\openssl\__init__.py", line 7, in <module>
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\hazmat\backends\openssl\backend.py", line 71, in <module>
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\hazmat\bindings\openssl\binding.py", line 195, in <module>
  File "C:\Users\frpegora\AppData\Local\Programs\Python\Python37\lib\site-packages\cryptography\hazmat\bindings\openssl\binding.py", line 142, in init_static_locks
ImportError: DLL load failed: The specified module could not be found.

我以为已经解决的问题又回来了!

更准确地说,前段时间我在 cx_Freeze 的 setup.py 中使用此解决方法传递了 paramiko 所需的 DLL:

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))

build_exe_options = {"packages": ['cffi', 'cryptography'],
                     'include_files': [ os.path.join(PYTHON_INSTALL_DIR, "DLLs", "libcrypto-1_1-x64.dll"),
                     os.path.join(PYTHON_INSTALL_DIR, "DLLs", "libssl-1_1-x64.dll")]}

问题是,正如我从朋友的 PC 上发布的错误所示,程序正在我的 PC 路径上寻找那些 DLL!

您能提出不同的解决方案吗?我尝试了所有方法,包括:

  • 手动传递 DLL
  • 复制错误中显示的整个文件夹

这是我的 setup.py:

from cx_Freeze import setup, Executable 
import os.path

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))

build_exe_options = {"packages": ['cffi', 'cryptography'], 'include_files': [ ('libssl-1_1-x64.dll', os.path.join('lib', 'libssl-1_1-x64.dll')),
 ('libcrypto-1_1-x64.dll', os.path.join('lib', 'libcrypto-1_1-x64.dll'))]}


target = Executable(
    script="main_window.py",
    base = "Win32GUI",
    icon="images\\icon.ico"
    )

setup(name = "AppGen" , 
    version = "0.1" , 
    description = "" ,
    options={'build_exe': build_exe_options},
    executables = [target])

【问题讨论】:

  • 请考虑使用带有反引号 ` 的 code formatting 而不是 bold 来强调包名称,例如 cx_Freeze 和 paramiko。

标签: python paramiko cx-freeze pyside2


【解决方案1】:

查看GitHub repository of cryptography,导致错误的行似乎是:

__import__("_ssl")

因此,您朋友的 PC 上可能缺少 _ssl。尝试添加

import _ssl

到您的主脚本或修改设置脚本中的build_exe_options,如下所示:

build_exe_options = {"packages": ['cffi', 'cryptography'],
                     'include_files': [os.path.join(PYTHON_INSTALL_DIR, "DLLs", "libcrypto-1_1-x64.dll"),
                                       os.path.join(PYTHON_INSTALL_DIR, "DLLs", "libssl-1_1-x64.dll")],
                     'includes': ['_ssl']}

关于你的陈述:

问题是,正如我从朋友的电脑上发布的错误所示,程序正在我的电脑路径上寻找那些 dll!

您可能被回溯中显示的路径误导了:这些是附加到代码对象的文件名,当冻结的应用程序被移动时,这些文件名可能不会被实现。请参阅我对How to fix numpy dependencies path on a python 3.7.3 script on Linux frozen with cx_Freeze 6.0b1? 的回答了解更多详细信息以及允许在冻结时实现路径的 cx_Freeze 选项。

【讨论】:

  • 不错的答案!过几天我会试一试,然后告诉你!
  • 好的,这不是问题。我想我可能正在使用 cx_Oracle,这是一个用于 python 的 oracle 客户端连接器,它要求您的环境路径中有一个 oracle 文件。所以,我知道如何将文件包含在 cx_freeze 中,但是如何设置环境路径?
  • 查看 cx_Oracle 和 cx_Freeze 的开发人员关于 PyInstaller 类似问题的this answer。
  • 是的,我知道使用 cx_oracle 需要做什么,我想知道如何在 cx_freeze setup.py 中使用 python 来完成。
  • 如果我正确理解你想要你做什么和链接的答案,你想要做什么是不可能的。要么已经在目标机器上安装了 Oracle 客户端,然后您的冻结脚本将在该机器上正常工作,要么没有在该机器上安装 Oracle 客户端,并且您的安装脚本没有(合法)方式也可以自动安装该机器上的许可 Oracle 客户端。但也许我误解了一些东西,如果您想了解更多信息,请使用minimal reproducible example 提出一个新问题,您的错误消息,并确保添加cx-oracle 标签。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2018-01-06
  • 2015-07-23
  • 1970-01-01
相关资源
最近更新 更多