Pyinstaller:生成.exe文件+文件夹(在--onefile模式下)



现在我正在使用Pyinstaller。我有一个从img文件夹中获取图像的脚本。。

/python
|----/img
|----|----icon1.ico
|----|----icon2.ico
|----maint.py

我要生成.exe的脚本是

pyinstaller.py --windowed --noconsole --clean --onefile maint.py

问题是只生成.exe文件,而忽略了整个文件夹/img。

问题:为了自动获取.exe文件+/img文件夹,我需要在前一行中放入哪些传统语法

我的意思是:在执行了pyinstaller.py脚本和所有参数后,我必须在/dist文件夹中看到:.exe文件+/img文件夹,其中包含我的应用程序的所有图标或位图文件

感谢

这就是我解决问题的方法:

我使用当前版本的PYInstaller+Python2.67,SublimeText作为编辑器。

  1. 如果Py脚本需要一些文件、图标、图像,则必须包含一个函数,该函数可以从项目文件夹(在开发中)或临时数据文件夹(在部署中)中检索这些文件。这个脚本必须在你的代码中,正好在你放置亲属路径以获得资源的部分。请严格遵循此指南。

  2. 在前面的代码之后,您必须第一次执行pyinstaller命令——正如我在问题中所说的那样。

  3. 现在,打开PYInstaller(位于PYinstaller/YourAppName/中)命令执行后生成的.spec文件,并在a.binaries行之后将下一行添加到EXE()函数中:

    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              Tree('..\python\images', prefix='images\'),
    ....
    

    请记住,在Tree(...)函数中,第一个参数是要放在外部的文件夹:,这意味着我想将此文件夹的所有内容(请注意,我正在将一个相对于AppStart.py文件的相对路径)包含到我的.EXE文件的文件容器中

  4. 修改后,重新执行pyinstaller命令,但在本例中指向我的.SPEC文件:

    pyinstaller.py --windowed --noconsole --clean --onefile AppStartAppStart.spec
    

最后,我的应用程序可以作为可执行程序执行,而不需要像某人提到的那样复制和粘贴所有外部文件夹但我一如既往地认为这是一种实用的好方法

感谢您的支持。

您也可以在另一个python脚本中运行pyinstaller,然后使用shutil.copytree()将文件夹移到后面。或者对单个文件使用shutil.copyfile()

import PyInstaller.__main__
import shutil
PyInstaller.__main__.run([
    'YourProgram.py',
    '--icon=UI/Your_Icon.ico',
    '--onefile',
    '--noconsole',
], )
shutil.copytree('path/', 'dist/path')

您必须解决许多问题才能使其正常工作。例如:

  • 获取正确的资源路径
  • 添加数据

第一个问题(如前所述)是通过根据执行模式调整路径来解决的。

def app_path(path):
    frozen = 'not'
    if getattr(sys, 'frozen', False):
            # we are running in executable mode
            frozen = 'ever so'
            app_dir = sys._MEIPASS
    else:
            # we are running in a normal Python environment
            app_dir = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(app_dir, path)

对于第二个问题,我使用通配符运算符(*)来添加我需要的内容,而不是树。

added_files = [
         ( './pics/*', 'pics' ),
         ( './db/*', 'db' ),
         ]

然后在分析中,

datas = added_files

完整的答案很长。我写这篇文章是为了在一些微小的细节中展示我为解决这个问题所做的努力。

最新更新