py2exe-生成单个可执行文件

2024-12-13 08:37:00
admin
原创
95
摘要:问题描述:我以为我听说py2exe可以做到这一点,但我从未弄清楚。有人成功做到了吗?我可以看看你的 setup.py 文件吗?你使用了哪些命令行选项?基本上,我想让它给我一个可执行文件,该文件可以执行诸如将其自身解压缩到 /temp 并运行之类的操作。解决方案 1:使用 py2exe 执行此操作的方法是使用 ...

问题描述:

我以为我听说py2exe可以做到这一点,但我从未弄清楚。有人成功做到了吗?我可以看看你的 setup.py 文件吗?你使用了哪些命令行选项?

基本上,我想让它给我一个可执行文件,该文件可以执行诸如将其自身解压缩到 /temp 并运行之类的操作。


解决方案 1:

使用 py2exe 执行此操作的方法是使用 setup.py 文件中的 bundle_files 选项。对于单个文件,您需要将其设置bundle_files为 1,compressed设置为 True,并将 zipfile 选项设置为 None。这样,它会创建一个压缩文件以便于分发。

以下是直接从py2exe 网站引用的 bundle_file 选项的更完整描述*

使用“bundle_files”和“zipfile”

创建单文件可执行文件的更简单(更好)方法是将 bundle_files 设置为 1 或 2,并将 zipfile 设置为 None。此方法不需要将文件提取到临时位置,从而可以更快地启动程序。

bundle_files 的有效值为:

  • 3(默认)不捆绑

  • 2 捆绑除 Python 解释器之外的所有内容

  • 1 捆绑所有内容,包括 Python 解释器

如果将 zipfile 设置为 None,则文件将捆绑在可执行文件中,而不是 library.zip 中。

以下是一个示例 setup.py:

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
    windows = [{'script': "single.py"}],
    zipfile = None,
)

解决方案 2:

PyInstaller将创建一个没有依赖项的 .exe 文件;使用该--onefile选项。它通过将所有需要的共享库打包到可执行文件中,然后在运行之前解压它们来实现这一点,就像您描述的那样(编辑:py2exe 也有此功能,请参阅minty 的答案)

我使用 svn 的 PyInstaller 版本,因为最新版本 (1.3) 有点过时了。对于依赖 PyQt、PyQwt、numpy、scipy 和其他一些应用程序的应用程序来说,它运行得非常好。

解决方案 3:

正如其他发帖者提到的py2exe,将生成一个可执行文件 + 一些要加载的库。您还可以将一些数据添加到程序中。

下一步是使用安装程序,将所有这些打包成一个易于使用的可安装/可卸载程序。

我已经愉快地使用InnoSetup好几年了,并且将其用于商业程序,因此我衷心推荐它。

解决方案 4:

我已经能够创建一个 exe 文件,并将所有资源嵌入到 exe 中。我正在 Windows 上构建。这样就可以解释我正在使用的一些 os.system 调用。

首先,我尝试将所有图像转换为位图,然后将所有数据文件转换为文本字符串。但这导致最终的 exe 非常大。

经过一周的 Google 搜索后,我找到了如何修改 py2exe 脚本来满足我的需求。

这是我在 sourceforge 上提交的补丁链接,请发表评论,以便我们将其包含在下一个发行版中。

http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583

这解释了所做的所有更改,我只是在设置行中添加了一个新选项。这是我的setup.py。

我会尽力评论。请注意,我的 setup.py 很复杂,因为我通过文件名访问图像。所以我必须存储一个列表来跟踪它们。

这是我想要制作的一个屏幕保护程序。

我使用 exec 在运行时生成我的设置,这样剪切和粘贴更容易。

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\n      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\n      options={'py2exe': py2exe_options},\n      zipfile = None )" % (bitmap_string[:-1])

分解

script = py 脚本我想转换成 exe

icon_resources = exe 的图标

file_resources = 我想要嵌入到 exe 中的文件

other_resources = 嵌入到 exe 中的字符串,在本例中为文件列表。

options = py2exe 选项,用于将所有内容创建为一个 exe 文件

bitmap_strings = 要包含的文件列表

请注意,在您按照上面的链接所述编辑 py2exe.py 文件之前,file_resources 不是一个有效选项。

我第一次尝试在这个网站上发布代码,如果我错了,请不要责骂我。

from distutils.core import setup
import py2exe #@UnusedImport
import os

#delete the old build drive
os.system("rmdir /s /q dist")

#setup my option for single file output
py2exe_options = dict( ascii=True,  # Exclude encodings
                       excludes=['_ssl',  # Exclude _ssl
                                 'pyreadline', 'difflib', 'doctest', 'locale',
                                 'optparse', 'pickle', 'calendar', 'pbd', 'unittest', 'inspect'],  # Exclude standard library
                       dll_excludes=['msvcr71.dll', 'w9xpopen.exe',
                                     'API-MS-Win-Core-LocalRegistry-L1-1-0.dll',
                                     'API-MS-Win-Core-ProcessThreads-L1-1-0.dll',
                                     'API-MS-Win-Security-Base-L1-1-0.dll',
                                     'KERNELBASE.dll',
                                     'POWRPROF.dll',
                                     ],
                       #compressed=None,  # Compress library.zip
                       bundle_files = 1,
                       optimize = 2                        
                       )

#storage for the images
bitmap_string = '' 
resource_string = ''
index = 0

print "compile image list"                          

for image_name in os.listdir('images/'):
    if image_name.endswith('.jpg'):
        bitmap_string += "( " + str(index+1) + "," + "'" + 'images/' + image_name + "'),"
        resource_string += image_name + " "
        index += 1

print "Starting build
"

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\n      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\n      options={'py2exe': py2exe_options},\n      zipfile = None )" % (bitmap_string[:-1])

print "Removing Trash"
os.system("rmdir /s /q build")
os.system("del /q *.pyc")
print "Build Complete"

好的,这就是 setup.py 的全部内容,现在需要魔法来访问图像。我开发这个应用程序时没有考虑 py2exe,后来才添加它。所以你会看到两种情况下的访问。如果找不到图像文件夹,它会尝试从 exe 资源中提取图像。代码会解释它。这是我的 sprite 类的一部分,它使用 directx。但您可以使用任何您想要的 api 或只是访问原始数据。没关系。

def init(self):
    frame = self.env.frame
    use_resource_builtin = True
    if os.path.isdir(SPRITES_FOLDER):
        use_resource_builtin = False
    else:
        image_list = LoadResource(0, u'INDEX', 1).split(' ')

    for (model, file) in SPRITES.items():
        texture = POINTER(IDirect3DTexture9)()
        if use_resource_builtin: 
            data = LoadResource(0, win32con.RT_RCDATA, image_list.index(file)+1) #windll.kernel32.FindResourceW(hmod,typersc,idrsc)               
            d3dxdll.D3DXCreateTextureFromFileInMemory(frame.device,   #Pointer to an IDirect3DDevice9 interface
                                              data,                #Pointer to the file in memory
                                              len(data),           #Size of the file in memory
                                              byref(texture))      #ppTexture
        else:
            d3dxdll.D3DXCreateTextureFromFileA(frame.device, #@UndefinedVariable
                                               SPRITES_FOLDER + file,
                                               byref(texture))            
        self.model_sprites[model] = texture
    #else:
    #    raise Exception("'sprites' folder is not present!")

如有任何问题请随时提问。

解决方案 5:

您应该创建一个安装程序,如前所述。尽管也可以让 py2exe 将所有内容捆绑到一个可执行文件中,方法是将 bundle_files 选项设置为 1,将 zipfile 关键字参数设置为 None,但我不建议对 PyGTK 应用程序这样做。

这是因为 GTK+ 会尝试从加载它的目录中加载其数据文件(本地文件、主题等)。因此,您必须确保可执行文件的目录还包含 GTK+ 使用的库以及 GTK+ 安装中的目录 lib、share 等。否则,在未安装 GTK+ 的机器上运行应用程序时会遇到问题。

有关更多详细信息,请阅读我的PyGTK 应用程序 py2exe 指南。它还解释了如何捆绑除 GTK+ 之外的所有内容。

解决方案 6:

有人告诉我bbfreeze将创建一个单独的文件 .EXE,并且比 py2exe 更新。

解决方案 7:

我最近使用 py2exe 创建了一个用于后期审查的可执行文件,用于将评论发送到 ReviewBoard。

这是我使用的setup.py

from distutils.core import setup
import py2exe

setup(console=['post-review'])

它创建了一个包含 exe 文件和所需库的目录。我认为不可能使用 py2exe 只获取单个 .exe 文件。如果需要,您需要先使用 py2exe,然后使用某种形式的安装程序来制作最终的可执行文件。

需要注意的一点是,您在应用程序中使用的任何 egg 文件都需要解压缩,否则 py2exe 无法包含它们。py2exe 文档中介绍了这一点。

解决方案 8:

尝试
c_x freeze
它可以创建一个好的独立

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1048  
  在产品开发领域,如何提升产品交付质量一直是企业关注的焦点。集成产品开发(IPD)作为一种系统化的产品开发方法,通过跨职能团队的协同、流程的优化以及资源的整合,能够有效提升产品的交付质量。IPD培训作为推动这一方法落地的重要工具,不仅能够帮助团队理解IPD的核心原则,还能通过实践和案例学习,提升团队的执行力和协作效率。本...
IPD研发管理体系   0  
  在现代企业中,跨部门合作已成为项目成功的关键因素之一。随着业务复杂性的增加,单一部门难以独立完成复杂的项目任务,因此需要多个部门的协同努力。然而,跨部门合作往往面临沟通不畅、职责不清、资源冲突等挑战,这些问题如果得不到有效解决,将直接影响项目的进度和质量。在这种背景下,IPD(集成产品开发)项目流程图作为一种系统化的管...
华为IPD流程   0  
  在研发IPD(集成产品开发)流程中,跨部门协作是确保项目成功的关键因素之一。IPD流程强调从概念到市场的全生命周期管理,涉及市场、研发、制造、供应链等多个部门的协同工作。然而,由于各部门的目标、工作方式和优先级不同,跨部门协作往往面临沟通不畅、资源冲突、决策延迟等挑战。为了应对这些挑战,企业需要采取系统化的方法,优化跨...
IPD概念阶段   0  
  在项目管理的生命周期中,CDCP(Concept Development and Control Plan)阶段是项目从概念到实施的关键过渡期。这一阶段不仅需要明确项目的目标和范围,还需要确保项目团队能够灵活应对可能出现的变更和调整。变更管理在这一阶段尤为重要,因为任何未经控制的变更都可能对项目的进度、成本和质量产生深...
IPD流程中TR   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用