当前位置: 首页 > 面试题库 >

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

锺英彦
2023-03-14
问题内容

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

所有图形用户界面都位于林间空地文件中,并且使用了一些图像。我希望将我的应用程序编译成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文件。但是,要使我的应用程序正常工作,我必须将林间 空地图像 文件复制到exe的文件夹中。

有什么办法可以将这些文件编译为可执行文件?

我已经以各种方式编辑了我的规范文件,但是我无法实现我想要的。下面的规范文件仅将文件复制到目录,而不编译为可执行文件

# -*- 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')

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


问题答案:

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"


 类似资料:
  • 问题内容: 我刚刚使用Eclipse编写了一个简单程序,并且想将其编译为可执行文件,但似乎根本找不到如何执行的方法。 问题答案: 你可以通过以下方式将.jar文件转换为.exe: 1- JSmooth .exe包装器: JSmooth是Java可执行包装器。它为Java应用程序创建本机Windows启动器(标准.exe)。由于它能够自行查找任何已安装的Java VM,因此它使Java部署更加流畅和

  • 问题内容: 在kivy论坛中没有得到回应,因此请在这里尝试。 当我将教程pong代码编译为一个文件可执行文件时,我仍然必须将pong.kv文件包含在同一文件夹中才能运行。否则,启动exe时出现以下错误: 如何使它作为一个可执行文件运行。这是我的pong.spec文件: 请注意,我尝试将pong.kv包括在数据列表中,但这没有帮助。 谢谢,-Raj 问题答案: 根据KeyWeeUsr提供的链接(将数

  • Android项目中可编译的资源文件存放在res目录下,在R.java中会自动生成这些资源文件的ID,可以通过R.XXX.ID来访问。 光标放在不同的文件夹上,新建列表中显示的选项是不同的。 1.如果光标放到module上. 操作步骤: 菜单栏: File | 右击module —> New —> Android resource file 弹出[New Resource File]对话框 Fil

  • 情况如下: 在gradle构建期间,我从依赖项下载并解压缩资源 项目中的一个类将处理这些资源,并生成要包含在项目中的新资源(作为生成的资源) 我设法想出了一个简单的解决方案,在“classes”任务之后运行生成器,并将资源写入: 这很好,生成的资源随后包含在JAR中 但是当上传人工制品时,它会上传JAR,而不会上传生成的资源。 我试图用正确的方法来做: 但我最终得到了一个循环依赖,因为Gradle

  • 以下是我的cmake代码: 我尝试从链接中合并步骤,但没有工作,并得到以下错误: /usr/bin/ld:尝试动态对象的静态链接`/usr/lib/x86_64-linux-gnu/libglu.so'collect2:错误:ld返回1退出状态src/cmakefiles/wwest-export-app.out.dir/build.make:774:recipe for targe'bin/ww

  • 问题内容: 是否可以编译无需重新编译即可在所有Linux发行版中执行的C / C ++源代码? 如果答案是肯定的,我可以使用任何外部(非标准C / C ++)库吗? 我要分发我的二进制应用程序,而不是分发源代码。 问题答案: 不,您不能编译在所有Linux发行版中执行的可执行文件。但是,您可以编译可在人们倾向于关注的大多数发行版上运行的可执行文件。 编译32位。为您愿意支持的最低CPU级别进行编译