6

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

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

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

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

PyInstaller 完美运行并创建一个 exe 文件。但是为了使我的应用程序正常工作,我必须将我的glade图像文件复制到 exe 的文件夹中。

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

我以各种方式编辑了我的规范文件,但我无法实现我想要的。下面的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')

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

4

3 回答 3

6

通过一些更改,您可以将所有内容合并到您的源代码中,从而合并到您的可执行文件中。

如果您gdk-pixbuf-csource在图像文件上运行,您可以将它们转换为字符串,然后您可以使用gtk.gdk.pixbuf_new_from_inline().

您还可以将 Glade 文件作为字符串包含在程序中,然后使用gtk.Builder.add_from_string().

于 2011-07-14T11:31:01.610 回答
6

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"
于 2011-10-06T13:52:54.437 回答
1

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

严格来说:不,因为你编译源代码,而glade文件是XML,图像是二进制数据。您通常要做的是创建一个安装程序(即一个自解压存档,在运行安装程序时将不同的文件放置在正确的目录中)。

编辑:如果您只关心一个文件可执行文件(所以它不是关于“编译”,而是关于永久写入文件系统的文件数量),您可以尝试使用基于py2exe的脚本。它的作用是在每次运行程序时创建临时文件,并在执行完成时将其删除。

EDIT2:显然你所要求的也可以在PyInstaller下实现。从文档中:

默认情况下,pyinstaller.py 创建一个包含主要可执行文件和动态库的分发目录。选项 --onefile 指定您希望 PyInstaller 构建一个包含所有内容的单个文件。

于 2011-07-14T07:46:43.143 回答