Пакет cx_Freeze не работает на другой машине - PullRequest
0 голосов
/ 20 июня 2019

Хорошо, я разработал настольное приложение PySide и хотел поделиться им, используя cx_Freeze .У меня были некоторые проблемы с упаковкой paramiko библиотеки, но я решил использовать этот обходной путь .

Все работало на моей машине, что означало двойной щелчок на .exe, сгенерированномcx_Freeze приложение запускалось и работает правильно.

Большое разочарование наступило, когда я протестировал пакет на компьютере моего друга.

Приложение не запустилось и показало эту ошибку:

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.

Проблема, которую я решил решить, вернулась снова!

Точнее, некоторое время назад я прошелDLL, необходимые для paramiko , использующего этот обходной путь в setup.py для cx_Freeze :

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")]}

Проблема заключается в том, что, как показано в ошибке, которую я отправил с моегоПК друга, программа ищет эти 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])

1 Ответ

1 голос
/ 25 июня 2019

Глядя на хранилище криптографии GitHub , строка, вызывающая ошибку, выглядит следующим образом:

__import__("_ssl")

Таким образом, вероятно, _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']}

Относительно вашего заявления:

Проблема в том, что, как показано в сообщении об ошибке, которое я отправил с компьютера моего друга, программа ищет эти библиотеки на пути моего компьютера!

Возможно, вас вводят в заблуждение пути, показанные в трассировке: это имена файлов, прикрепленные к объектам кода, которые, по-видимому, не реализуются при перемещении замороженного приложения. См. Мой ответ на Как исправить путь с множественными зависимостями в скрипте python 3.7.3 в Linux, замороженном с cx_Freeze 6.0b1? , для получения дополнительной информации и опции cx_Freeze, позволяющей актуализировать пути при замораживании.

...