当前位置: 首页 > 知识库问答 >
问题:

添加配置文件在PyInster--onefile exe到dist目录

俞学
2023-03-14

我正在Windows上使用Pyinstaller制作一个。我的项目的exe文件。

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

我的程序使用配置。ini用于存储配置选项的文件。此文件可由用户自定义。

使用--onefile选项Pyinstaller将所有声明的“数据文件”放入单个中。exe文件。

我见过这个请求,但它给出了在同一级别的中,在onefile中添加bundle文件,而不是在外部添加的指令。exe并位于同一个dist目录中。

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

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


共有2个答案

和谦
2023-03-14

我的解决方案类似于@Stefano Giraldi的优秀解决方案。将目录传递给shutil时,我的权限被拒绝。复制文件

我最终使用了shutil。复制树

import sys, os, shutil

site_packages = os.path.join(os.path.dirname(sys.executable), "Lib", "site-packages")
added_files = [
                (os.path.join(site_packages, 'dash_html_components'), 'dash_html_components'),
                (os.path.join(site_packages, 'dash_core_components'), 'dash_core_components'),
                (os.path.join(site_packages, 'plotly'), 'plotly'),
                (os.path.join(site_packages, 'scipy', '.libs', '*.dll'), '.')
                ]
working_dir_files = [
                ('assets', 'assets'),
                ('csv', 'csv')
                ]

print('ADDED FILES: (will show up in sys._MEIPASS)')
print(added_files)
print('Copying files to the dist folder')

print(os.getcwd())
for tup in working_dir_files:
        print(tup)
        to_path = os.path.join(DISTPATH, tup[1])
        if os.path.exists(to_path):
                if os.path.isdir(to_path):
                        shutil.rmtree(to_path)
                else:
                        os.remove(to_path)
        if os.path.isdir(tup[0]):
                shutil.copytree(tup[0], to_path )
        else:
                shutil.copyfile(tup[0], to_path )

#### ... Rest of spec file
a = Analysis(['myapp.py'],
             pathex=['.', os.path.join(site_packages, 'scipy', '.libs')],
             binaries=[],
             datas=added_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='myapp',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

这样可以避免使用_-MEI文件夹,并防止它复制您想要在dist文件夹中而不是临时文件夹中的配置文件。

希望有帮助。

谭越
2023-03-14

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

我使用了shutil模块和。specfile,使用Pyinstaller--onefile选项将额外的数据文件(在我的示例中是aconfig sample.inifile)添加到dist文件夹。

首先,我创建了一个makespec文件,其中包含我需要的选项:

$ pyi-makespec --onefile --windowed --name exefilename scriptname.py

这个comand创建一个exefilename.spec文件与PyInster一起使用

现在我编辑了文件名。spec在文件末尾添加以下代码。

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

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

最后一步是运行编译进程

pyinstaller --clean exefilename.spec

结果是,在dist文件夹中,您应该已编译该文件。exe文件以及复制的数据文件。

在PyInster的官方留档中,我没有找到获得此结果的选项。我认为这可以被认为是一种变通方法...有效。

 类似资料:
  • 问题内容: 情况 我在Windows上使用Pyinstaller制作项目的.exe文件。 我想使用option来获得干净的结果和易于分发的文件/程序。 我的程序使用一个文件来存储配置选项。该文件可以由用户定制。 问题 使用选项Pyinstaller将所有声明的“数据文件”放入单个文件文件中。 我已经看到了这个请求,但它给istructions添加一个包文件 的onefile内部 ,而不是外部的,在

  • 我正在和pyinstaller做斗争。每当我使用kivy GUI和。kv文件,并运行。生成后,我收到一个致命错误: 我已经尝试添加了。kv文件,以及使用--add-data的mdb和dsn文件(对于PyODBC),但我得到一个错误:。(还有更多内容——为提到的其他文件添加数据参数。) 有没有解决这个问题的方法,或者其他的方法?

  • 你知道 Puppet 能做微创手术吗? 通常,我们不希望将整个配置文件交由 Puppet 管理而仅仅是在配置文件中添加某项设置 — 尤其是如果该文件是由别人管理,我们不能覆盖它的情况。 一种简单而有用的方法是,如果配置文件中不存在指定的行就添加这行配置。例如: 添加一个内核模块名到配置文件 /etc/modules 告知内核在启动时加载此模块。 你可以使用一个 exec 资源达成此任务。下面的例子

  • 有了Web框架和ORM框架,我们就可以开始装配App了。 通常,一个Web App在运行时都需要读取配置文件,比如数据库的用户名、口令等,在不同的环境中运行时,Web App可以通过读取不同的配置文件来获得正确的配置。 由于Python本身语法简单,完全可以直接用Python源代码来实现配置,而不需要再解析一个单独的.properties或者.yaml等配置文件。 默认的配置文件应该完全符合本地开

  • 我有一个当地的库伯内特斯环境,我基本上是复制的。将kube/config文件添加到我的本地文件中,并将“上下文”、“用户”和“集群”信息添加到我当前的“.kube/config”文件中。没关系,我可以连接到本地文件。 但是我想用命令将这些信息添加到我的本地配置文件中。 因此,关于这个页面,我可以使用“证书颁发机构数据”作为参数,如下所示:--- 但它会抛出如上所述的错误。我用的是kubernete

  • 我有几个外部文件要添加到jar文件中,并在类中访问这些文件。我使用命令从命令行运行这个jar文件。所以当我使用绝对路径时,我可以访问文件内容,但当我使用相对路径时,我得到。我已将这两个文件都包含在目录中。我试过使用,它们都不起作用。还试图在构建中包含文件。从{[“file1.conf”,“file2.conf”]}中升级