py2exe – 生成单个可执行文件

我以为我听说py2exe能够做到这一点,但我从来没有想出来。 有没有人成功做到这一点? 我可以看到你的setup.py文件,以及你使用了哪些命令行选项?

基本上我正在考虑给我一个单一的可执行文件,像解压缩自己可能/温度和运行。

PyInstaller将创build一个没有依赖关系的.exe文件。 使用--onefile选项。 它通过将所有需要的共享库打包到可执行文件中,并在运行之前解压它们,就像你描述的那样(编辑:py2exe也有这个function,请参阅minty的答案 )

我使用svn的PyInstaller版本,因为最新版本(1.3)已经过时了。 对于一个依赖于PyQt,PyQwt,numpy,scipy等等的应用程序来说,它一直工作得非常好。

使用py2exe来做到这一点的方法是使用setup.py文件中的bundle_files选项。 对于单个文件,您需要将bundle_files设置为1, compressed为True,并将zipfile选项设置为None。 这样它创build一个压缩文件,便于分发。

这里是一个更完整的描述直接从py2exe网站引用的bundle_file选项*

使用“bundle_files”和“zipfile”

创build单文件可执行文件的一种更简单(更好)的方法是将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, ) 

正如另一个海报提到,py2exe,将生成一个可执行文件+一些库来加载。 您也可以将一些数据添加到您的程序中。

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

我已经使用了InnoSetup( http://www.jrsoftware.org/isinfo.php )好几年和商业程序,所以我衷心推荐它。

如前所述,您应该创build一个安装程序。 尽pipe也可以让py2exe把所有东西都捆绑到一个可执行文件中,通过将bundle_files选项设置为1,并将zipfile关键字参数设置为None,我不推荐这个用于PyGTK应用程序。

这是因为GTK +试图从它加载的目录加载它的数据文件(当地人,主题等)。 所以你必须确保你的可执行文件的目录也包含GTK +所使用的库以及你安装GTK +的目录lib,share等等。 否则,您将在GTK +未安装在系统上的机器上运行应用程序时出现问题。

有关更多详细信息,请阅读我的py2exe for PyGTK应用程序指南 。 它也解释了如何捆绑一切,但GTK +。

我已经能够创build一个单一的EXE文件与所有资源embedded到EXE。 我正在build立窗户。 所以这将解释我使用的一些os.system调用。

首先,我试图把所有的图像转换成bitmats,然后把所有的数据文件转换成文本string。 但是这导致最终的exe非常大。

googleing一个星期后,我想出了如何改变py2exe脚本来满足我的需求。

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

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

这解释了所有的变化,我简单地添加了一个新的选项设置线。 这是我的setup.py。

我会尽力评论它,尽我所能。 请知道,我的setup.py是复杂的事实,即我通过文件名访问图像。 所以我必须存储一个列表来跟踪它们。

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

我使用exec在运行时生成我的设置,它的easyer就像这样剪切和粘贴。

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

分解

脚本= py脚本我想转向一个exe文件

icon_resources = exe的图标

file_resources =文件我想embedded到EXE文件

other_resources =一个stringembedded到exe,在这种情况下,一个文件列表。

options = py2exe选项,用于创build一个exe文件

bitmap_strings =要包含的文件列表

请注意,file_resources不是一个有效的选项,直到你编辑你的py2exe.py文件,如上面的链接中所述。

第一次我试图在这个网站上发布代码,如果我弄错了,不要阻止我。

 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\n" exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\ 'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\ options={'py2exe': py2exe_options},\ 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的应用程序,然后再添加它。 所以你会看到两种情况的访问。 如果无法find图像文件夹,它会尝试从EXE资源拉图像。 代码将解释它。 这是我的精灵类的一部分,它使用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!") 

任何问题都可以随意问。

我被告知bbfreeze会创build一个文件.EXE,比py2exe更新。

尝试c_x冻结它可以创build一个很好的独立

我最近使用py2exe来创build一个可执行文件,以发送评论ReviewBoard后审查。

这是我使用的setup.py

 from distutils.core import setup import py2exe setup(console=['post-review']) 

它创build了一个包含exe文件和需要的库的目录。 我不认为有可能使用py2exe来获得一个单一的.exe文件。 如果你需要,你将需要首先使用py2exe,然后使用某种forms的安装程序,使最终的可执行文件。

有一点需要注意的是,你应用程序中使用的任何蛋文件都需要解压,否则py2exe不能包含它们。 这在py2exe文档中有介绍。

不,从某种意义上来说,它不会给你一个单一的可执行文件 – 但是你有一个包含运行程序所需的所有东西的目录,包括一个exe文件。

我今天写了这个setup.py 。 你只需要调用python setup.py py2exe