Используя Inno Setup, Python 3.6.8-32bit, созданный .exe работает на исходном компьютере, но не на других компьютерах. - PullRequest
0 голосов
/ 25 июня 2019

Я создал файл .exe, который отлично работает на компьютере, на котором я написал сценарии, но не запускается на других компьютерах со следующей ошибкой:

Fatal Python error: Py_Initialize: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x0003cf8 (most recent call first):

1: Я загрузил Python 3.6.8 на другой компьютер, на котором я хочу установить .exe, и обязательно установил опцию «ADD Python to PATH» при установке. Я также проверил системный путь переменных среды, чтобы убедиться, что он был добавлен правильно.

2: В Inno Setup я включил все файлы, созданные в сборке:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not 
use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{AFEEF19B-9CCE-46CB-BE48-03F561834912}
AppName=Order Pro
AppVersion=1.0
;AppVerName=Order Pro 1.0
AppPublisher=AC Mechanical, Inc.
AppPublisherURL=N/A
AppSupportURL=N/A
AppUpdatesURL=N/A
DefaultDirName={autopf}\Order Pro
DisableProgramGroupPage=yes
LicenseFile=C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32- 
3.6\legal\README.md
; Uncomment the following line to run in non administrative install mode 
(install for current user only.)
;PrivilegesRequired=lowest
OutputDir=C:\Users\awilliamson\Desktop
OutputBaseFilename=Order Pro installer
Compression=lzma
SolidCompression=yes
WizardStyle=modern

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\OrderPro.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\python36.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\data\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;  Permissions: users-modify
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\images\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\legal\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\lib\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\tcl\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\tk\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\awilliamson\PycharmProjects\OrderPro\build\exe.win32-3.6\lib\encodings\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{autoprograms}\Order Pro"; Filename: "{app}\OrderPro.exe"
Name: "{autodesktop}\Order Pro"; Filename: "{app}\OrderPro.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\OrderPro.exe"; Description: "{cm:LaunchProgram,Order Pro}"; Flags: nowait postinstall skipifsilent

3: я прочитал следующую ветку:

Основная причина довольно проста: Python не находит каталог своих модулей, поэтому он, конечно, не может загружать и кодировки

Документ Python по встраиванию говорит, что "Py_Initialize () вычисляет путь поиска модуля на основе его наилучшего предположения" ... "В частности, он ищет каталог с именем lib / pythonX.Y"

Тем не менее, если модули установлены в (просто) lib - относительно двоичного файла python - вышеприведенное предположение неверно.

Хотя в документах говорится, что PYTHONHOME и PYTHONPATH считаются, мы заметили, что это не так; их фактическое присутствие или содержание не имело никакого значения.

Единственное, что оказало влияние, это вызов Py_SetPath () с, например, [путь к] \ lib в качестве аргумента перед Py_Initialize ().

Конечно, это только вариант для сценария встраивания, где есть прямой доступ и контроль над кодом; с готовым решением могут потребоваться специальные шаги для решения проблемы.

Я не понимаю, какой файл редактировать, чтобы изменить, где Py_Initialize () ищет файл 'encodings'. В cmd подскажите? Файл init ? Inno Setup? Я запутался, потому что .exe работает нормально и может найти «кодировки» на исходном компьютере, а не на других компьютерах. Я проверил получающиеся установочные файлы, и они похожи. Есть ли способ изменить Py_Initalize (), чтобы можно было найти «кодировки»?

...