如何将所有资源编译成一个可执行文件?

2024-10-01 17:33:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了GTK应用程序。

所有的图形用户界面都在glade文件中,并且使用了一些图像。我想把我的应用程序编译成可执行文件。为此,我使用了编译器和打包器。

我已经按照手册上说的做了:

python Configure.py
python Makespec.py --onefile --windowed --upx /path/to/yourscript.py
python Build.py /path/to/yourscript.spec

PyInstaller工作得很好,创建了一个exe文件。但要使我的应用程序正常工作,我必须将gladeimage文件复制到exe的文件夹中。

有没有办法把这些文件编译成可执行文件?

我已经用各种方式编辑了我的spec文件,但是我无法实现我想要的。下面的Spec文件只将文件复制到目录,但不编译成可执行文件

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'r:\\connection\\main.py'],
             pathex=['C:\\Documents and Settings\\Lixas\\Desktop\\pyinstaller-1.5-rc1'])

pyz = PYZ(a.pure)

exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'NetworkChecker.exe'),
          debug=False,
          strip=False,
          upx=True,
          console=False,
          icon='r:\\connection\\ikona.ico'        )

coll = COLLECT(
    exe,
    [('gui.glade', 'r:\\connection\\gui.glade', 'DATA')],
    [('question16.png', 'r:\\connection\\question16.png', 'DATA')],
#   a.binaries,
#   strip=False,
    upx=True,
    name='distFinal')

我希望只有一个包含所有内容的可执行文件


Tags: 文件topathpyfalse应用程序可执行文件os
3条回答

只需做一些更改,就可以将所有内容合并到源代码中,从而合并到可执行文件中。

如果对图像文件运行^{},则可以将它们转换为字符串,然后可以使用^{}加载这些字符串。

您还可以将Glade文件作为字符串包含在程序中,然后使用^{}加载它。

PyInstaller允许您将所有资源捆绑到exe中,而不需要将数据文件转换为.py文件——COLLECT对象似乎是正确的,棘手的步骤是在运行时访问这些文件。PyInstaller将把它们解压到一个临时目录中,并用MEIPASS2变量告诉您它们在哪里。要在开发模式和打包模式下获取文件路径,我使用以下命令:

def resource_path(relative):
    return os.path.join(
        os.environ.get(
            "_MEIPASS2",
            os.path.abspath(".")
        ),
        relative
    )


# in development
>>> resource_path("gui.glade")
"/home/shish/src/my_app/gui.glade"

# in deployment
>>> resource_path("gui.glade")
"/tmp/_MEI34121/gui.glade"

Is there any way to compile those files into executable?

严格地说:不,因为you compile source code,而glade文件是XML,图像是二进制数据。您通常要做的是创建一个安装程序(即,当安装程序运行时,将不同文件放在正确目录中的自解包存档)。

编辑:如果您只关心一个文件的可执行性(因此这不是关于“编译”,而是关于永久写入文件系统的文件数量),那么可以尝试基于py2exe使用this script。它的作用是每次运行程序时创建临时文件,在执行完成时删除它们。

EDIT2:显然,您所要求的内容在PyInstaller下也是可能的。从documentation

By default, pyinstaller.py creates a distribution directory containing the main executable and the dynamic libraries. The option --onefile specifies that you want PyInstaller to build a single file with everything inside.

相关问题 更多 >

    热门问题