将Pyinstaller --onefile exe外部的配置文件添加到dist目录中

Ste*_*ldi 9 python pyinstaller

情况

我在Windows上使用Pyinstaller来制作我项目的.exe文件.

我想使用--onefile选项来获得干净的结果和易于分发的文件/程序.

我的程序使用一个config.ini文件来存储配置选项.该文件可由用户自定义.

问题

使用--onefile选项Pyinstaller将所有声明的"data-file"放在单个.exe文件文件中.

我已经看到了这个请求,但它给istructions添加一个包文件的onefile内部,而不是外部的,在与同级别.exe,并在同一dist目录下.

在某些时候,我曾想过在.spec文件中使用shutil.copy命令来复制这个文件......但我认为是错误的.

有人能帮我吗?我会很感激的:-)

Ste*_*ldi 8

Github上的一个存储库帮助我找到了我的问题的解决方案.

我使用shutil模块和.spec文件config-sample.ini使用Pyinstaller --onefile选项将额外的数据文件(在我的情况下是一个文件)添加到dist文件夹.

为pyinstaller创建一个.spec文件

首先,我使用我需要的选项创建一个makepec文件:

$ pyi-makespec --onefile --windowed --name exefilename scriptname.py
Run Code Online (Sandbox Code Playgroud)

此命令创建一个exefilename.spec与Pyinstaller一起使用的文件

修改exefilename.spec添加shutil.copyfile

现在我已经编辑了exefilename.spec文件末尾添加以下代码.

import shutil
shutil.copyfile('config-sample.ini', '{0}/config-sample.ini'.format(DISTPATH))
shutil.copyfile('whateveryouwant.ext', '{0}/whateveryouwant.ext'.format(DISTPATH))
Run Code Online (Sandbox Code Playgroud)

此代码复制编译过程结束时所需的数据文件.您可以使用shutil包中提供的所有方法.

运行PyInstaller

最后一步是运行编译过程

pyinstaller --clean exefilename.spec
Run Code Online (Sandbox Code Playgroud)

结果是在dist文件夹中,您应该将已编译的.exe文件与复制的数据文件一起使用.

考虑

在Pyinstaller的官方文档中,我没有找到获得此结果的选项.我认为它可以被认为是一种解决方法......有效.

  • 我知道这是一个旧答案,但我仍在寻找这个问题的解决方案。这个答案有很多赞成票,所以我想我错过了一些东西。这会将配置文件复制到与可执行文件相同的目录,但似乎没有任何方法在运行时将配置文件的路径提供给 exe。这个问题在这个答案中解决了/sf/ask/4265614181/但没有解决文件与 onefile exe 位于同一目录中的问题 (3认同)

use*_*974 5

以下是如何访问与输出文件处于同一级别的文件。诀窍在于 sys.executable 是单文件 .exe 所在的位置。所以简单地这样做就可以了:

import sys
import os.path
CWD = os.path.abspath(os.path.dirname(sys.executable))
Run Code Online (Sandbox Code Playgroud)

使用它,例如

with open(os.path.join(CWD, "config.ini")) as config_file:
    print(config_file.read())
Run Code Online (Sandbox Code Playgroud)

os.getcwd()/relative 路径不起作用的原因

可执行文件只是一个可执行存档,在执行时被提取到临时目录,.pyc文件在该目录中执行。因此,当您调用os.getcwd()而不是可执行文件的路径时,您将获得临时文件夹的路径。