NSIS, устанавливаемые в программные файлы, не получают доступа к зависимостям

#python #pyinstaller #bundle #executable #nsis

Вопрос:

У меня есть исполняемый файл python, созданный с помощью pyinstaller. Я создал установщик с помощью NSIS.Установщик и программа (исполняемый файл python) отлично работают, когда я устанавливаю папку с программой на рабочий стол (очевидно, что папка с программой находится не здесь). Когда я устанавливаю папку программы в «Программные файлы», установщик работает нормально, но приложение работает не так, как ожидалось. В частности, зависимости от шрифта и изображений базы данных (sqlite3), все в соответствующих папках в основной папке программы. Начальное состояние приложения отлично загружается с изображениями и данными БД, но как только начинаются запросы к изображениям и данным БД, программа выходит из строя. Я не могу проверить, чтобы найти проблему, так как исходный код работает нормально без проблем, и так как программа работает нормально, когда каталог программы установлен на рабочий стол, проблема либо в pyinstaller, либо в NSIS (у меня нет большого опыта в этом. Я в основном веб-разработчик.) Я использовал генератор сценариев быстрой настройки NSIS для создания сценария nsi. вот мои аргументы pyinstaller-один файл-оконный, а ниже приведен мой сценарий, сгенерированный nsi, у меня есть три зависимые папки, шрифты и изображения базы данных. изображения не статичны и изменяются в зависимости от ввода пользователя. Любые советы или документы были бы великолепны 👌

 

!define APP_NAME "appname"
!define COMP_NAME "COMPANY"
!define WEB_SITE "Website"
!define VERSION "1.00.00.00"
!define COPYRIGHT "Website � 2021"
!define DESCRIPTION "Application"
!define INSTALLER_NAME "C:UsersSATRUSTOneDriveDesktopappname Free Setup.exe"
!define MAIN_APP_EXE "appname Free.exe"
!define INSTALL_TYPE "SetShellVarContext current"
!define REG_ROOT "HKCU"
!define REG_APP_PATH "SoftwareMicrosoftWindowsCurrentVersionApp Paths${MAIN_APP_EXE}"
!define UNINSTALL_PATH "SoftwareMicrosoftWindowsCurrentVersionUninstall${APP_NAME}"
!define MUI_ICON "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesappname2.ico"



VIProductVersion  "${VERSION}"
VIAddVersionKey "ProductName"  "${APP_NAME}"
VIAddVersionKey "CompanyName"  "${COMP_NAME}"
VIAddVersionKey "LegalCopyright"  "${COPYRIGHT}"
VIAddVersionKey "FileDescription"  "${DESCRIPTION}"
VIAddVersionKey "FileVersion"  "${VERSION}"



SetCompressor ZLIB
Name "${APP_NAME}"
Caption "${APP_NAME}"
OutFile "${INSTALLER_NAME}"
BrandingText "${APP_NAME}"
XPStyle on
InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" ""
InstallDir "$DESKTOPappname"



!include "MUI.nsh"

!define MUI_ABORTWARNING
!define MUI_UNABORTWARNING

!insertmacro MUI_PAGE_WELCOME

!ifdef LICENSE_TXT
!insertmacro MUI_PAGE_LICENSE "${LICENSE_TXT}"
!endif

!ifdef REG_START_MENU
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "appname Free"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}"
!insertmacro MUI_PAGE_STARTMENU Application $SM_Folder
!endif

!insertmacro MUI_PAGE_INSTFILES

!define MUI_FINISHPAGE_RUN "$INSTDIR${MAIN_APP_EXE}"
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_CONFIRM

!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_UNPAGE_FINISH

!insertmacro MUI_LANGUAGE "English"



Section -MainProgram
${INSTALL_TYPE}
SetOverwrite ifnewer
SetOutPath "$INSTDIR"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0main.py"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0appname Free.exe"
SetOutPath "$INSTDIRimages"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesAppsIconBlack.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesAppsIconWhite.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagescross.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesdropdown.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesNotesIconBlack.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesNotesIconWhite.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesradio-off.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesradio-on.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesSettingIconBlack.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesSettingsIconWhite.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagestick.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagestoggle-off.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagestoggle-on.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesappname.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesappname2.ico"
SetOutPath "$INSTDIRfonts"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0fontsNunito-Regular.ttf"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0fontsNunito-SemiBoldItalic.ttf"
SetOutPath "$INSTDIRdatabase"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0databasedb.py"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0databaserunner.db"
SectionEnd



Section -Additional
SetOutPath "$APPDATA${APP_NAME}"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0main.py"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0appname Free.exe"
SetOutPath "$APPDATA${APP_NAME}images"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesAppsIconBlack.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesAppsIconWhite.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagescross.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesdropdown.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesNotesIconBlack.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesNotesIconWhite.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesradio-off.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesradio-on.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesSettingIconBlack.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesSettingsIconWhite.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagestick.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagestoggle-off.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagestoggle-on.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesappname.png"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0imagesappname2.ico"
SetOutPath "$APPDATA${APP_NAME}fonts"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0fontsNunito-Regular.ttf"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0fontsNunito-SemiBoldItalic.ttf"
SetOutPath "$APPDATA${APP_NAME}database"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0databasedb.py"
File "C:UsersSATRUSTOneDriveDesktopappname Free 1.0.0databaserunner.db"
SectionEnd



Section -Icons_Reg
SetOutPath "$INSTDIR"
WriteUninstaller "$INSTDIRuninstall.exe"

!ifdef REG_START_MENU
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS$SM_Folder"
CreateShortCut "$SMPROGRAMS$SM_Folder${APP_NAME}.lnk" "$INSTDIR${MAIN_APP_EXE}"
CreateShortCut "$DESKTOP${APP_NAME}.lnk" "$INSTDIR${MAIN_APP_EXE}"
!ifdef WEB_SITE
WriteIniStr "$INSTDIR${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}"
CreateShortCut "$SMPROGRAMS$SM_Folder${APP_NAME} Website.lnk" "$INSTDIR${APP_NAME} website.url"
!endif
!insertmacro MUI_STARTMENU_WRITE_END
!endif

!ifndef REG_START_MENU
CreateDirectory "$SMPROGRAMSappname Free"
CreateShortCut "$SMPROGRAMSappname Free${APP_NAME}.lnk" "$INSTDIR${MAIN_APP_EXE}"
CreateShortCut "$DESKTOP${APP_NAME}.lnk" "$INSTDIR${MAIN_APP_EXE}"
!ifdef WEB_SITE
WriteIniStr "$INSTDIR${APP_NAME} website.url" "InternetShortcut" "URL" "${WEB_SITE}"
CreateShortCut "$SMPROGRAMSappname Free${APP_NAME} Website.lnk" "$INSTDIR${APP_NAME} website.url"
!endif
!endif

WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR${MAIN_APP_EXE}"
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}"  "DisplayName" "${APP_NAME}"
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}"  "UninstallString" "$INSTDIRuninstall.exe"
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}"  "DisplayIcon" "$INSTDIR${MAIN_APP_EXE}"
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}"  "DisplayVersion" "${VERSION}"
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}"  "Publisher" "${COMP_NAME}"

!ifdef WEB_SITE
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}"  "URLInfoAbout" "${WEB_SITE}"
!endif
SectionEnd



Section Uninstall
${INSTALL_TYPE}
Delete "$INSTDIRmain.py"
Delete "$INSTDIRappname Free.exe"
Delete "$INSTDIRimagesAppsIconBlack.png"
Delete "$INSTDIRimagesAppsIconWhite.png"
Delete "$INSTDIRimagescross.png"
Delete "$INSTDIRimagesdropdown.png"
Delete "$INSTDIRimagesNotesIconBlack.png"
Delete "$INSTDIRimagesNotesIconWhite.png"
Delete "$INSTDIRimagesradio-off.png"
Delete "$INSTDIRimagesradio-on.png"
Delete "$INSTDIRimagesSettingIconBlack.png"
Delete "$INSTDIRimagesSettingsIconWhite.png"
Delete "$INSTDIRimagestick.png"
Delete "$INSTDIRimagestoggle-off.png"
Delete "$INSTDIRimagestoggle-on.png"
Delete "$INSTDIRimagesappname.png"
Delete "$INSTDIRimagesappname2.ico"
Delete "$INSTDIRfontsNunito-Regular.ttf"
Delete "$INSTDIRfontsNunito-SemiBoldItalic.ttf"
Delete "$INSTDIRdatabasedb.py"
Delete "$INSTDIRdatabaserunner.db"


RmDir "$INSTDIRdatabase"
RmDir "$INSTDIRfonts"
RmDir "$INSTDIRimages"

 
Delete "$INSTDIRuninstall.exe"
!ifdef WEB_SITE
Delete "$INSTDIR${APP_NAME} website.url"
!endif

RmDir "$INSTDIR"

!ifndef NEVER_UNINSTALL
Delete "$APPDATA${APP_NAME}main.py"
Delete "$APPDATA${APP_NAME}appname Free.exe"
Delete "$APPDATA${APP_NAME}imagesAppsIconBlack.png"
Delete "$APPDATA${APP_NAME}imagesAppsIconWhite.png"
Delete "$APPDATA${APP_NAME}imagescross.png"
Delete "$APPDATA${APP_NAME}imagesdropdown.png"
Delete "$APPDATA${APP_NAME}imagesNotesIconBlack.png"
Delete "$APPDATA${APP_NAME}imagesNotesIconWhite.png"
Delete "$APPDATA${APP_NAME}imagesradio-off.png"
Delete "$APPDATA${APP_NAME}imagesradio-on.png"
Delete "$APPDATA${APP_NAME}imagesSettingIconBlack.png"
Delete "$APPDATA${APP_NAME}imagesSettingsIconWhite.png"
Delete "$APPDATA${APP_NAME}imagestick.png"
Delete "$APPDATA${APP_NAME}imagestoggle-off.png"
Delete "$APPDATA${APP_NAME}imagestoggle-on.png"
Delete "$APPDATA${APP_NAME}imagesappname.png"
Delete "$APPDATA${APP_NAME}imagesappname2.ico"
Delete "$APPDATA${APP_NAME}fontsNunito-Regular.ttf"
Delete "$APPDATA${APP_NAME}fontsNunito-SemiBoldItalic.ttf"
Delete "$APPDATA${APP_NAME}databasedb.py"
Delete "$APPDATA${APP_NAME}databaserunner.db"
 
RmDir "$APPDATA${APP_NAME}database"
RmDir "$APPDATA${APP_NAME}fonts"
RmDir "$APPDATA${APP_NAME}images"

 
RmDir "$APPDATA${APP_NAME}"
!endif

!ifdef REG_START_MENU
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $SM_Folder
Delete "$SMPROGRAMS$SM_Folder${APP_NAME}.lnk"
!ifdef WEB_SITE
Delete "$SMPROGRAMS$SM_Folder${APP_NAME} Website.lnk"
!endif
Delete "$DESKTOP${APP_NAME}.lnk"

RmDir "$SMPROGRAMS$SM_Folder"
!endif

!ifndef REG_START_MENU
Delete "$SMPROGRAMSappname Free${APP_NAME}.lnk"
!ifdef WEB_SITE
Delete "$SMPROGRAMSappname Free${APP_NAME} Website.lnk"
!endif
Delete "$DESKTOP${APP_NAME}.lnk"

RmDir "$SMPROGRAMSappname Free"
!endif

DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}"
DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}"
SectionEnd





 

Комментарии:

1. Проблема в python, а не в NSIS. Вероятно, вы загружаете файлы относительно текущего каталога, а не каталога программы.

2. Если вы пытаетесь выполнить запись в базу данных, это также может вызвать проблему. Приложения не должны записываться в файлы в папке program files.

3. Спасибо за помощь, использование абсолютных значений решит проблему с изображениями. Я не знал, что вы не можете писать в файлы в файлах программы. Вы случайно не знаете, как я могу писать в базу данных, которая хранится локально?

4.Я провел некоторое исследование и нашел стандартный способ использования локальной базы данных в Windows 10. вот несколько полезных ссылок для тех, кто борется с той же проблемой. codeproject.com/Questions/798662/…docs.microsoft.com/en-us/previous-versions/windows/desktop /…