py2exe使用教程(二)——提供运行时库

本文译自Py2exe官网 http://www.py2exe.org/


5. 提供 Microsoft Visual C 运行时库

Python 的解释器是通过Microsoft Visual C编译的,所以你的新程序需要Microsoft Visual C 运行时库才能运行。如果你已经安装了相应版本的 Python 或者 Visual Studio,那么你的电脑上就已经安装了这个库文件。如果你的用户中有一些人还没有这个库文件,那么他们将无法运行你的程序。解决这个问题的方法取决于你使用的 Python 版本:

5.1. Python 2.4 or 2.5

如果你使用的是 Python 2.4 或 2.5,你需要的 DLL库文件名为 MSVCR71.dll。这个 DLL 有可能已经在你的 dist 目录下了,这种情况下你不需要做任何事情。

尽管如此,这个文件的版权是属于 Microsoft 的,你需要去确认你是否有合法的权利去再发行它。如果你有一个 Visual Studio的副本,在安装时提供的文件 redist.txt 中确认你是否有这个DLL文件的再发行权。一般情况下,如果你有Microsoft Visual C++ 的许可,你就有权去再发行它,除非你使用的是精简版。

如果你没有再发行 MSVCR71.dll 的权利,那么你的用户就必须自己安装它,可以通过 Microsoft Visual C++ 2005 Redistributable Package (vcredist_x86.exe)来安装。

你可以通知你的用户自己去下载并安装,也可以在你的应用程序中创建一个包含 vcredist_x86.exe(它本身是可以被任何人再发行的) 的安装程序 (参考下面的步骤 6),作为你的应用程序安装的一部分来运行。

5.2. Python 2.6, 2.7, 3.0, 3.1

对于 Python 2.6,你需要的 DLL 文件名为 MSVCR90.dll。Py2exe 不能在 dist 目录下自动包含这个文件, 所以你必须自己提供。

令人头疼的是,这个文件有不止一个的版本存在, 而且每个版本的名字都一样。 你需要的版本是用来编译 Python 解释器的相同版本,即 version 9.0.21022.8.  把你的鼠标悬浮在这个 dll 文件(或者 vcredist_x86.exe 可执行安装程序)上,通过显示的这些说明,确认你得到的版本。 你需要的 vcredist_x86.exe 包含在 Microsoft Visual C++ 2008 Redistributable Package 发布于 29-11-2007, 而不是 VS2008 SP1 ( 在Python 2.7.1 上测试)。

就像旧版本的 Python, 你需要去Visual Studio安装文件中检查 redist.txt ,看看你是否有这个文件合法的再发行权利。 如果你有权利,那么你可以选择把这个 C 运行时库文件捆绑到你的应用程序上。 如果你没有这个权利, 那么你必须让你的用户在他们自己的机器上运行这个可再发行的 C 运行时安装程序。

5.2.1. 创建 C 运行时库

如果你有再发行 MSVCR90.dll 的合法权利, 在你的 Visual Studio 安装目录下有一个副本, 目录 VC\redist\x86\Microsoft.VC90.CRT。 从 Visual Studio 2008开始, 你就不能单独复制再发行这个 DLL 文件了 - 你还需要放在那里的一个 manifest 文件。 在 redist.txt 文件中声明:你必须发行所有这三个 dll 库文件和这个不可修改的 manifest 文件,只发行他们当中的某一个库文件是违反许可协议的行为 (尽管 py2exe 只需要 SVCR90.dll)。

redist.txt 文件中的相关章节描述如下:

  • "For your convenience, we have provided the following folders for use when redistributing VC++ runtime files. Subject to the license terms for the software, you may redistribute the folder (unmodified) in the application local folder as a sub-folder with no change to the folder name. You may also redistribute all the files (*.dll and *.manifest) within a folder, listed below the folder for your convenience, as an entire set."

你必须确保 py2exe 复制所有的三个 dll 文件和 manifest 文件到你的工程目录 dist 下,并且放在一个名为 'Microsoft.VC90.CRT' 的子目录下。 为了实现这个目的, 需要在setup.py 中添加一个 data_files 选项:

  from glob import glob
  data_files = [("Microsoft.VC90.CRT", glob(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]
  setup(
    data_files=data_files,
    etc
  )

在这种情况下, 运行 py2exe 需要把这些文件放在你的 dist 目录下:

  dist
  |
  +-Microsoft.VC90.CRT
  | |
  | +-Microsoft.VC90.CRT.manifest
  | +-msvcm90.dll
  | +-msvcp90.dll
  | +-msvcr90.dll
  |
  |-etc

现在, 只要简单的复制整个 dist 目录到你的用户机器上,甚至在那些没有自己复制过 C++ 运行时副本的机器上都可以运行你的程序。

注意: 这个包含 C 运行时的方法是通过使用了几个 Visual C++ 应用 —— 如果在 Program Files 目录下搜索 msvcr90.dll,可能会发现好几个应用程序包含像这样捆绑在可执行文件上的DLL 文件和相关联的 manifest 文件。

同样需要注意的是尽管做了以上所有的工作, py2exe 仍然会抱怨:找不到 MSVCP90.dll。 你必须编辑 setup.py 把这些库文件的路径添加到系统路径中, 例如

    sys.path.append("C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\redist\\x86\\Microsoft.VC90.CRT")

5.2.1.1 win32ui 特例

win32ui 需要 MFC DLLs 才能运行 .exe 文件, 参考 Py2exeAndWin32ui 获得更多的信息。

5.2.2. 运行可再发行的 C 运行时安装程序

如果你没有权利再发行 MSVCR90.dll, 那么你的用户可以通过运行 Microsoft Visual C++ 2008 Redistributable Package (vcredist_x86.exe)在自己的机器上进行安装。 重要的是,不要使用 SP1 版的安装程序, 它包含了一个错误版本的MSVCR90.dll。

你可以通知你的用户自己去下载并安装,也可以为你的程序创建一个包含了vcredist_x86.exe (它本身是可以被任何人再发行的)的安装程序 (参考下面的步骤 6 ), 作为你的应用程序安装的一部分来运行。

这个安装程序把这些库文件的副本放在如下目录 C:\WINDOWS\WinSxS (XP), 里面是经过重整命名的子目录。 manifest 文件在 'Manifests' 子目录, 同样也会有一个经过重整命名的文件名。 你仍然可以通过在这些经过了重整命名的文件和目录名中识别文本 'Microsoft.VC90.CRT' 和 '9.0.21022.8' 来找到这些文件。复制这些文件并且删除经过重整命名的文件名,像5.2.1中描述的那样嵌入到你的应用程序。(翻译水平有限,附上原文:The installer puts a copy of the DLLs in the directory C:\WINDOWS\WinSxS (XP), inside subdirectories with mangled names. The manifest file is in the 'Manifests' subdirectory, again this will have a mangled filename. You can still discern the text 'Microsoft.VC90.CRT' and '9.0.21022.8' within the mangled file and directory names, to find the files. It is possible to take a copy of these files and remove the filename mangling, to embed them in your application as described in 5.2.1. )

6. 如果有必要,创建一个安装程序

py2exe 不是一个安装程序构建器 —— 它仅仅是把你的Python 程序运行所需要的文件整理打包在一起。 外面有许多很好的安装程序构建器,其中一些是开源的 (如: NSIS) 一些是免费的 (如: Inno Setup)。


展开阅读全文

没有更多推荐了,返回首页