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

时间:2011-07-14 06:43:33

标签: python compiler-construction pygtk glade pyinstaller

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

所有图形用户界面都在glade文件中,并且使用了一些图像。我希望将我的应用程序编译为EXEcutable文件。为此,我使用 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 image 文件复制到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')

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

3 个答案:

答案 0 :(得分:6)

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

如果您对图片文件运行gdk-pixbuf-csource,则可以将其转换为字符串,然后可以使用gtk.gdk.pixbuf_new_from_inline()加载。

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

答案 1 :(得分: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"

答案 2 :(得分:1)

  

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

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

编辑:如果您只关心拥有单文件可执行文件(因此不是“编译”,而是关于永久写入文件系统的文件数量),您可以尝试根据{{​​3}}使用this script。它的作用是每次运行程序时创建临时文件,在执行完成后删除它们。

EDIT2:显然,py2exe下也可以提出要求。来自PyInstaller

  

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