py2exe-生成单个可执行文件

时间:2020-03-06 14:31:09  来源:igfitidea点击:

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

基本上,我在考虑它给我一个可执行文件,该文件执行诸如将自身解压缩到/ temp并运行的操作。

解决方案

不,就我们之后只有一个文件而言,它没有给我们一个可执行文件,但是我们有一个目录,其中包含运行程序所需的所有文件,包括exe文件。

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

PyInstaller将创建一个没有依赖关系的.exe文件。使用--onefile选项。它通过将所有需要的共享库打包到可执行文件中,然后在运行之前解压缩它们来完成此操作,正如我们所描述的那样(编辑:py2exe也具有此功能,请参见minty的答案)

我使用的是svn的PyInstaller版本,因为最新版本(1.3)有点过时了。对于依赖于PyQt,PyQwt,numpy,scipy等应用程序的应用来说,它的运行情况非常好。

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

这是我使用的setup.py

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选项设置为None。这样,它会创建一个压缩文件以便于分发。

这是直接从py2exe网站引用的bundle_file选项的更完整说明*

Using "bundle_files" and "zipfile"
  
  An easier (and better) way to create
  single-file executables is to set
  bundle_files to 1 or 2, and to set
  zipfile to None. This approach does
  not require extracting files to a
  temporary location, which provides
  much faster program startup.
  
  Valid values for bundle_files are:
  
  
  3 (default) don't bundle 
  2 bundle everything but the Python interpreter
  1 bundle everything, including the Python interpreter 
  
  
  If zipfile is set to None, the files will be bundle
  within the executable instead of 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)已经有好几年了,并且用于商业程序,所以我衷心推荐它。

我被告知bbfreeze将创建一个文件.EXE,并且比py2exe更新。

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

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

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