文中资料来源于Py2exe安装包里的sample,C:\Python27\Lib\site-packages\py2exe\samples
下面是一个非常简单的setup脚本,用于创建2个可执行文件。
hello.py是一个简单的“hello, world”式的程序,test_wx.py 则是一个简单的wxpython程序,不显示后台命令窗口的程序。在命令提示符后键入'setup.py py2exe' 或在 'python setup.py py2exe' 来执行打包过程。
如果一切顺利,你将得到一个“dist”子目录,包含hello.exe 和test_wx.exe 以及一些其他文件。
from distutils.core import setup import py2exe setup( version = "0.5.0", description = "py2exe sample script", name = "py2exe samples", # targets to build windows = ["test_wx.py"], console = ["hello.py"], )前三个参数不是必须的,如果给定了一个'version' 参数,那么一个版本信息将会被创建并且嵌入到可执行文件的属性中。
如果设置了这些参数的话,可以把鼠标悬浮在可执行文件上,查看文件的版本信息,也可以右键在属性->详细中查看文件的详细信息(版本,描述等)。
参数 windows 用来创建一个图形用户界面程序;
参数 console 用来创建一个控制台程序。
下面这个setup脚本通过在 manifest 文件中设置不同的用户访问控制标志,创建的几个访问级别不同的可执行文件。
对于Python 2.6+, 创建一个无需通过 UAC(User Account Control,用户帐户控制) 控制权限的可执行文件,“asInvoker”级别下也是无需特殊权限。
尽管如此,对于2.5和更早版本,将会强制这个应用程序以兼容模式打开。(就像在生成的可执行文件中根本不存在 manifest 一样)
from distutils.core import setup import py2exe # The targets to build t1 = dict(script="hello.py", dest_base="not_specified") # targets with different values for requestedExecutionLevel t2 = dict(script="hello.py", dest_base="as_invoker", uac_info="asInvoker") t3 = dict(script="hello.py", dest_base="highest_available", uac_info="highestAvailable") t4 = dict(script="hello.py", dest_base="require_admin", uac_info="requireAdministrator") console = [t1, t2, t3, t4] windows = [t1.copy(), t2.copy(), t3.copy(), t4.copy()] for t in windows: t['dest_base'] += "_w" setup( version = "0.5.0", description = "py2exe user-access-control sample script", name = "py2exe samples", # targets to build windows = windows, console = console, )
这里创建了四种不同访问级别的可执行文件,每种级别有控制台程序和图形用户界面程序(以_w结尾)两种。
参数 dest_base 指定了生成的可执行文件的名称;
参数 uac_info 设定了运行可执行程序所需要的权限。
补充:
上面提到了requestedExecutionLevel,查了一下资料,如下:
Vista 和 Windows 7 操作系统为了加强安全,增加了 UAC(用户账户控制) 的机制,如果 UAC 被打开,用户即使是以管理员权限登录,其应用程序默认情况下也无法对系统目录,系统注册表等可能影响系统运行的设置进行写操作。
这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,即 Win7 中 以 as administrator 方式运行,那么我们怎么来实现这样的功能呢?
在 win7 下运行一些安装程序时,会发现首先弹出一个对话框,让用户确认是否同意允许这个程序改变你的计算机配置,但我们编写的应用程序默认是不会弹出这个提示的,也无法以管理员权限运行。
以上的示例中介绍了如何在py2exe下通过 setup 参数来设置来提示用户以管理员权限运行。
我们可以看到这个配置中有一个 requestedExecutionLevel 项,这个项用于配置当前应用请求的执行权限级别。这个项有3个值可供选择,如下表所示:
Value | Description | Comment |
asInvoker | The application runs with the same access token as the parent process. | Recommended for standard user applications. Do refractoring with internal elevation points, as per the guidance provided earlier in this document. |
highestAvailable | The application runs with the highest privileges the current user can obtain. | Recommended for mixed-mode applications. Plan to refractor the application in a future release. |
requireAdministrator | The application runs only for administrators and requires that the application be launched with the full access token of an administrator. | Recommended for administrator only applications. Internal elevation points are not needed. The application is already running elevated. |
那么后两个选项的区别在哪里呢?
区别在于,如果我们不是以管理员帐号登录,那么如果应用程序设置为 requireAdministrator ,那么应用程序就直接运行失败,无法启动。而如果设置为 highestAvailable,则应用程序可以运行成功,但是是以当前帐号的权限运行而不是系统管理员权限运行。如果我们希望程序在非管理员帐号登录时也可以运行(这种情况下应该某些功能受限制) ,那么建议采用 highestAvailable 来配置。
这里我们需要知道这三个选项分别代表什么含义就可以了,如果想了解更多关于requestedExecutionLevel 设置,请参考下面链接:
Create and Embed an Application Manifest (UAC)