【问题标题】:NSIS after PyInstaller Kivy app can't find databasePyInstaller Kivy 应用程序找不到数据库后的 NSIS
【发布时间】:2016-02-22 11:39:37
【问题描述】:

我使用 PyInstaller 成功打包了适用于 Windows 的 Kivy 应用程序,并且我的 app.exe 运行没有任何问题。 (.spec:Kivy 1.9.1 Windows package .spec single exe)

为了便于分发,我想将我的文件打包成一个独立的 .exe。我的 .nsi 文件:

SilentInstall silent
Section
InitPluginsDir
Setoutpath KanjiOrigin
File /r "dist\KanjiOrigin\*"
ExecWait "dist\KanjiOrigin\KanjiOrigin.exe"
Setoutpath $TEMP
SectionEnd

一个 .exe 的构建没有错误:http://pastebin.com/h91jzGgY

但是,当运行 NSIS 制作的这个 .exe 时,应用程序会一直运行,直到我需要连接到位于 data\db\Kanji-story.db 的内部数据库,但找不到该数据库。 (打开的时候.exe就在里面,所以数据库已经包含进去了)。

sqlite3.OperationalError: unable to open database: data\db\Kanji-story.db

当我使用 7zip 解压我的 .exe 并尝试从 PyInstaller 运行 KanjiOrigin.exe 时,我收到以下错误:D:\path\KanjiOrigin\KanjiOrigin.exe is not a valid Win32 application。 (不确定这是否相关)。

编辑 2

我不知道发生了什么变化,但是现在使用 7zip 打开 NSIS .exe 时,提取 PyInstaller .exe 不再出错。 但是,当尝试运行提取的 PyInstaller .exe 时,出现以下错误:

PyInstaller Bootloader 3.x
LOADER: executable is D:\path\KanjiOrigin\KanjiOrigin.exe
LOADER: homepath is D:\path\KanjiOrigin
LOADER: _MEIPASS2 is NULL
LOADER: archivename is D:\path\KanjiOrigin\KanjiOrigin.exe
LOADER: pyi_arch_check_cookie failed
LOADER: archivename is D:\path\KanjiOrigin\KanjiOrigin.pkg
LOADER: Cannot open archive: D:\path\KanjiOrigin\KanjiOrigin.pkg
Cannot open self D:\path\KanjiOrigin\KanjiOrigin.exe or archive D:\path\KanjiOrigin\KanjiOrigin.pkg

此外,包含的数据库似乎没有损坏,因为提取后我可以使用 sqlitebrowser (http://sqlitebrowser.org/) 成功打开它。

我做错了什么?是Setoutpath $TEMP吗?

编辑:

如果我在 NSIS 创建的 .exe 之外手动包含具有相同文件夹结构 (data\db\Kanji-story.db) 的数据库,它可以找到数据库吗?为什么它可以找到外部数据库,但不能找到 NSIS .exe 中包含的内部数据库?

【问题讨论】:

    标签: windows kivy nsis


    【解决方案1】:

    看起来你只是从某个地方复制了一些代码而没有理解它。

    SilentInstall silent
    Section
    InitPluginsDir
    SetOutPath $Pluginsdir ; This must be a full path
    File myapp.exe
    ExecWait '"$pluginsdir\myapp.exe"' ; This should be a full path as well.
    SetOutPath $TEMP
    SectionEnd
    

    对于临时提取 .exe 然后从 %Temp% 文件夹执行它的代码很典型,但您不会在安装程序中执行此操作,只有在您创建可移植应用程序包装器时。

    您代码中的另一个问题是您只是使用相对路径。来自SetOutPath 的文档:

    必须是完整的路径名,通常只是 $INSTDIR

    至于SetOutPath $TEMP 的作用; SetOutPath 在内部为进程设置当前目录,并且当前目录在应用程序运行时不能被删除,因此最后将其设置为 $TEMP 只是一种解决方法,only 如果您使用过,则需要使用SetOutPath $PluginsDir 因为您希望 NSIS 能够在 $PluginsDir 退出之前删除它。

    如果您使用 NSIS 编写可移植的应用程序包装器,那么您应该确保您使用的是完整路径,然后它应该可以工作。另一方面,如果您正在编写一个普通的安装程序,那么您不应该处理 $PluginsDir,您应该使用SetOutPath $InstDir 并且应该将InstallDir 属性设置为类似“$ProgramFiles\MyApp”

    【讨论】:

    • 我真的找不到制作可移植应用程序的教程(我想要的),我只能找到一个代码 sn-p。代码 sn -p 本来是不行的,所以我尝试通过修改代码来更好地理解。在某些时候我得到了一些工作,所以我认为我正在朝着正确的方向前进,但似乎我不是。感谢您的回答和解释,它有效!
    猜你喜欢
    • 2018-06-08
    • 2015-09-24
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多