Py2exe-生成单个可执行文件

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

基本上,我想给我一个单一的可执行文件,像解压缩本身可能/temp 和运行。

190620 次浏览

不,它不会提供一个单一的可执行文件,因为之后只有一个文件——但是您有一个目录,其中包含运行程序所需的所有内容,包括一个 exe 文件。

我今天刚刚编写了 这个圈套 Py,您只需要调用 python setup.py py2exe

PyInstaller 将创建一个单独的。没有依赖项的 exe 文件; 使用 --onefile选项。它将所有需要的共享库打包到可执行文件中,并在运行之前解压缩它们,正如您所描述的(EDIT: py2exe 也有这个特性,参见 薄荷味的答案)

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

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

这就是我设的圈套

from distutils.core import setup
import py2exe


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

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

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

使用 py2exe 的方法是在 setup.py 文件中使用 bundle _ files 选项。对于单个文件,您需要将 bundle_files设置为1,将 compressed设置为 True,并将 zipfile 选项设置为 Nothing。这样就可以创建一个压缩文件以便于分发。

下面是直接引用自 Py2exe 网站 * 的 bundle _ file 选项的更完整描述

使用“ bundle _ files”和“ zipfile”

一种更容易(也更好)的创造方式 单文件可执行文件 Bundle _ files 设置为1或2,并设置 这种方法可以 不需要将文件解压缩到 临时地点,提供 更快的程序启动。

Bundle _ files 的有效值是:

  • 3(默认值)不捆绑
  • 除了 Python 解释器之外的所有东西都打包
  • 1 bundle everything,包括 Python 解释器

如果 zipfile 设置为 Nothing,则文件将是 bundle 在可执行文件中,而不是在 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好几年了,并且在商业节目中使用,所以我衷心地推荐它。

我被告知 别动将创建一个单独的文件.EXE,并且比 py2exe 更新。

如前所述,您应该创建一个安装程序。尽管也可以让 py2exe 将所有内容捆绑到一个可执行文件中,但是通过将 bundle _ files 选项设置为1,将 zipfile 关键字参数设置为 Nothing,我不推荐对 PyGTK 应用程序使用这种方法。

这是因为 GTK + 试图从加载它的目录加载它的数据文件(本地文件、主题文件等)。因此,必须确保可执行文件的目录中还包含 GTK + 使用的库以及 GTK + 安装中的目录 lib、 share 等。否则,在没有在系统范围内安装 GTK + 的机器上运行应用程序时,将会出现问题。

要了解更多细节,请阅读我的 PyGTK 应用程序的 py2exe 指南。它还解释了如何捆绑一切,但 GTK + 。

我已经能够创建一个包含所有嵌入到 exe 中的资源的 exe 文件。 我在窗口上构建,这就能解释我用的一些操作系统调用了。

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

在谷歌了一个星期后,我找到了如何修改 py2exe 脚本,以满足我的需要。

这里是我提交的关于 source ceforgei 的补丁链接,请发表评论,这样我们就可以把它包括在内 下一个发行版。

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

这解释了所有的更改,我只是添加了一个新的选项到安装线。 这是我的计划 Py。

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

这是我试着做的一个“想要 B”屏幕保护程序里的。

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

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])

崩溃

Script = py script 我想转到 exe

Icon _ resources = exe 的图标

File _ resources = 我想嵌入到 exe 中的文件

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

Options = py2exe 选项,用于将所有内容创建到一个 exe 文件中

Bitmap _ string = 要包含的文件列表

请注意,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"

好了,设置完毕 现在魔法需要进入图像。 我开发这个应用程序时没有想到 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!")

任何问题都可以问。

C _ x 定格 它可以创建一个良好的独立