anaconda对python字典的运用(一)定义安装步骤的..
时间:2008-11-29 来源:适兕
在图形安装方式下,定义步骤时,在gui.py中有如下一个字典。
stepToClass = {
"language" : ("language_gui", "LanguageWindow"),
"agreement" : ("agreement_gui", "AgreementWindow"),
"keyboard" : ("keyboard_gui", "KeyboardWindow"),
"mouse" : ("mouse_gui", "MouseWindow"),
"welcome" : ("welcome_gui", "WelcomeWindow"),
"installtype" : ("installpath_gui", "InstallPathWindow"),
"zfcpconfig" : ("zfcp_gui", "ZFCPWindow"),
"partitionmethod" : ("partmethod_gui", "PartitionMethodWindow"),
"partition" : ("partition_gui", "PartitionWindow"),
"autopartition" : ("partition_gui", "AutoPartitionWindow"),
"findinstall" : ("examine_gui", "UpgradeExamineWindow"),
"addswap" : ("upgrade_swap_gui", "UpgradeSwapWindow"),
"upgrademigratefs" : ("upgrade_migratefs_gui", "UpgradeMigrateFSWindow"),
"fdisk" : ("fdisk_gui", "FDiskWindow"),
"bootloader": ("bootloader_main_gui", "MainBootloaderWindow"),
"bootloaderadvanced": ("bootloader_advanced_gui", "AdvancedBootloaderWindow"),
"upgbootloader": ("upgrade_bootloader_gui", "UpgradeBootloaderWindow"),
"network" : ("network_gui", "NetworkWindow"),
"firewall" : ("firewall_gui", "FirewallWindow"),
"timezone" : ("timezone_gui", "TimezoneWindow"),
"accounts" : ("account_gui", "AccountWindow"),
"authentication" : ("auth_gui", "AuthWindow"),
"desktopchoice": ("desktop_choice_gui", "DesktopChoiceWindow"),
"package-selection" : ("package_gui", "PackageSelectionWindow"),
"indivpackage" : ("package_gui", "IndividualPackageSelectionWindow"),
"dependencies" : ("dependencies_gui", "UnresolvedDependenciesWindow"),
"videocard" : ("xconfig_gui", "XConfigWindow"),
"monitor" : ("xconfig_gui", "MonitorWindow"),
"xcustom" : ("xconfig_gui", "XCustomWindow"),
"confirminstall" : ("confirm_gui", "InstallConfirmWindow"),
"confirmupgrade" : ("confirm_gui", "UpgradeConfirmWindow"),
"finishxconfig" : None,
"install" : ("progress_gui", "InstallProgressWindow_NEW"),
"bootdisk" : ("bootdisk_gui", "BootdiskWindow"),
"complete" : ("congrats_gui", "CongratulationWindow"),
}
而要谈到以后的调用,我们还得从另外一个文件的列表说起:那就是disptch.py中的
installSteps = [
("welcome", ()),
("betanag", betaNagScreen, ("intf", "dir")),
("language", ("intf", "id")),
("agreement", ("intf", "id", "dispatch")),
("keyboard", ("id.instLanguage.getDefaultKeyboard()", "id.keyboard")),
("checkmonitorok", checkMonitorOK, ("id.monitor", "dispatch")),
("monitor", ("id.xsetup", "id.monitor", "intf")),
("setsanex", setSaneXSettings, ("id.xsetup",)),
("findrootparts", findRootParts, ("intf", "id", "dispatch", "dir", "instPath")),
("findinstall", ("dispatch", "intf", "id", "instPath")),
("installtype", ("dispatch", "id", "method", "intf")),
("zfcpconfig", ("id.zfcp", "id.diskset", "intf")),
("indexmark1", doNothing, ()),
("partitionmethod", ("id.partitions", "id.instClass")),
("partitionobjinit", partitionObjectsInitialize, ("id.diskset",
"id.partitions",
"dir", "intf")),
("partitionmethodsetup", partitionMethodSetup, ("id.partitions",
"dispatch")),
("autopartition", ("id.diskset", "id.partitions", "intf", "dispatch")),
("autopartitionexecute", doAutoPartition, ("dir", "id.diskset",
"id.partitions", "intf",
"id.instClass", "dispatch")),
("fdisk", ("id.diskset", "id.partitions", "intf")),
("fdasd", ("id.diskset", "id.partitions", "intf")),
("partition", ("id.fsset", "id.diskset", "id.partitions", "intf")),
("upgrademount", upgradeMountFilesystems, ("intf", "id.upgradeRoot",
"id.fsset", "instPath")),
("upgradecontinue", queryUpgradeContinue, ("intf", "dir")),
("upgradeswapsuggestion", upgradeSwapSuggestion, ("dispatch", "id",
"instPath")),
("addswap", ("intf", "id.fsset", "instPath",
"id.upgradeSwapInfo", "dispatch")),
("partitiondone", partitioningComplete, ("id.bootloader", "id.fsset",
"id.diskset", "id.partitions",
"intf", "instPath", "dir")),
("upgrademigfind", upgradeMigrateFind, ("dispatch", "id.fsset")),
("upgrademigratefs", ("id.fsset",)),
("upgbootloader", ("dispatch", "id.bootloader")),
("bootloadersetup", bootloaderSetupChoices, ("dispatch", "id.bootloader",
"id.fsset", "id.diskset",
"dir")),
("bootloader", ("dispatch", "id.bootloader", "id.fsset", "id.diskset")),
("bootloaderadvanced", ("dispatch", "id.bootloader", "id.fsset",
"id.diskset")),
("networkdevicecheck", networkDeviceCheck, ("id.network", "dispatch")),
("network", ("id.network", "dir", "intf", "id")),
("firewall", ("intf", "id.network", "id.firewall", "id.security")),
("timezone", ("id.instLanguage", "id.timezone")),
("accounts", ("intf", "id.rootPassword")),
("authentication", ("id.auth",)),
("readcomps", readPackages, ("intf", "method", "id")),
("desktopchoice", ("intf", "id.instClass", "dispatch", "id.grpset")),
("findpackages", upgradeFindPackages, ("intf", "method", "id",
"instPath", "dir")),
("selectlangpackages", selectLanguageSupportGroups, ("id.grpset","id.instLanguage")),
("package-selection", ("id.grpset", "id.instLanguage", "id.instClass", "dispatch")),
("indivpackage", ("id.grpset",)),
("handleX11pkgs", handleX11Packages, ("dir", "intf", "dispatch",
"id", "instPath")),
("handlemiscpkgs", handleMiscPackages, ("intf", "id", "dir")),
("fixupconditionals", fixupConditionals, ("id.grpset",)),
("checkdeps", checkDependencies, ("dir", "intf", "dispatch",
"id", "instPath")),
("dependencies", ("id.grpset", "id.dependencies")),
("confirminstall", ("intf", "id",)),
("confirmupgrade", ("intf", "id",)),
("indexmark2", doNothing, ()),
("install", ("dir", "intf", "id")),
("enablefilesystems", turnOnFilesystems, ("dir", "id.fsset",
"id.diskset", "id.partitions",
"id.upgrade", "instPath")),
("migratefilesystems", doMigrateFilesystems, ("dir", "id.fsset",
"id.diskset", "id.upgrade",
"instPath")),
("setuptime", setupTimezone, ("id.timezone", "id.upgrade", "instPath",
"dir")),
("preinstallconfig", doPreInstall, ("method", "id", "intf", "instPath",
"dir")),
("installpackages", doInstall, ("method", "id", "intf", "instPath")),
("postinstallconfig", doPostInstall, ("method", "id", "intf", "instPath")),
("writeconfig", writeConfiguration, ("id", "instPath")),
("firstboot", firstbootConfiguration, ("id", "instPath")),
("instbootloader", writeBootloader, ("intf", "instPath", "id.fsset",
"id.bootloader", "id.instLanguage",
"id.grpset")),
("bootdisk", ("dir", "dispatch", "id.fsset")),
("makebootdisk", makeBootdisk, ("intf", "dir", "id.floppyDevice",
"id.grpset", "instPath", "id.bootloader")),
#
# we dont use videocard and xcustom currently, they are still listed as
# steps but are not listed in the list of install steps in installclass.py
#
("videocard", ("dispatch", "id.xsetup", "id.videocard", "intf")),
#
# this got moved up to just after mouse config, only runs if monitor probe
# failed. Needs to be here if we enable videocard and xcustom again.
# ("monitor", ("id.xsetup", "id.monitor", "intf")),
("xcustom", ("id.xsetup", "id.monitor", "id.videocard",
"id.desktop", "id.grpset", "id.instClass", "instPath")),
("writexconfig", writeXConfiguration, ("id", "instPath")),
("writeksconfig", writeKSConfiguration, ("id", "instPath")),
("setfilecon", setFileCons, ("instPath","id.partitions")),
("copylogs", copyAnacondaLogs, ("instPath",)),
("dopostaction", doPostAction, ("id", "instPath", "intf")),
("methodcomplete", doMethodComplete, ("method", "id.fsset")),
("dopostpost",doPostpost, ("method","id")),
("complete", ("intf", "id", "dispatch"))
]
同样在dispatch.py中实现了如下的方法:
def currentStep(self):
if self.step == None:
self.gotoNext()
elif self.step >= len(installSteps):
return (None, None)
stepInfo = installSteps[self.step]
step = stepInfo[0]
args = self.bindArgs(stepInfo[1])
return (step, args)
也就是说,当调用此方法时,它的返回返回值就是序列中的第一项,和一个元组。
来看gui.py中的一个调用此方法的方法:
def setScreen (self):
(step, args) = self.dispatch.currentStep() //这就是调用的所要求的返回值
if step is None:
gtk.main_quit() //如果序列中不存在此项,则直接崩溃。
return
if self.dir == 1:
return self.nextClicked()
else:
return self.prevClicked()
(file, className) = stepToClass[step] //这是对字典的操作,即去查询序列的第一项里是否是字典的key值。
newScreenClass = None
s = "from %s import %s; newScreenClass = %s" % (file, className,
className)
#print s
while 1:
try:
exec s
break
except ImportError, e:
print e
win = MessageWindow(_("Error!"),
_("An error occurred when attempting "
"to load an installer interface "
"component.\n\nclassName = %s") % (className,),
type="custom", custom_icon="warning",
custom_buttons=[_("_Exit"),
_("_Retry")]) //如果不存在,则会报这么一个错误。
if not win.getrc():
if flags.rootpath:
msg = _("The installer will now exit...")
buttons = [_("_Exit")]
else:
msg = _("Your system will now be rebooted...")
buttons = [_("_Reboot")]
MessageWindow(_("Rebooting System"),
msg,
type="custom",
custom_icon="warning",
custom_buttons=buttons)
sys.exit(0)
这个字典一直运行在anaconda的生命周期中。应当去注意它的无处不在。
stepToClass = {
"language" : ("language_gui", "LanguageWindow"),
"agreement" : ("agreement_gui", "AgreementWindow"),
"keyboard" : ("keyboard_gui", "KeyboardWindow"),
"mouse" : ("mouse_gui", "MouseWindow"),
"welcome" : ("welcome_gui", "WelcomeWindow"),
"installtype" : ("installpath_gui", "InstallPathWindow"),
"zfcpconfig" : ("zfcp_gui", "ZFCPWindow"),
"partitionmethod" : ("partmethod_gui", "PartitionMethodWindow"),
"partition" : ("partition_gui", "PartitionWindow"),
"autopartition" : ("partition_gui", "AutoPartitionWindow"),
"findinstall" : ("examine_gui", "UpgradeExamineWindow"),
"addswap" : ("upgrade_swap_gui", "UpgradeSwapWindow"),
"upgrademigratefs" : ("upgrade_migratefs_gui", "UpgradeMigrateFSWindow"),
"fdisk" : ("fdisk_gui", "FDiskWindow"),
"bootloader": ("bootloader_main_gui", "MainBootloaderWindow"),
"bootloaderadvanced": ("bootloader_advanced_gui", "AdvancedBootloaderWindow"),
"upgbootloader": ("upgrade_bootloader_gui", "UpgradeBootloaderWindow"),
"network" : ("network_gui", "NetworkWindow"),
"firewall" : ("firewall_gui", "FirewallWindow"),
"timezone" : ("timezone_gui", "TimezoneWindow"),
"accounts" : ("account_gui", "AccountWindow"),
"authentication" : ("auth_gui", "AuthWindow"),
"desktopchoice": ("desktop_choice_gui", "DesktopChoiceWindow"),
"package-selection" : ("package_gui", "PackageSelectionWindow"),
"indivpackage" : ("package_gui", "IndividualPackageSelectionWindow"),
"dependencies" : ("dependencies_gui", "UnresolvedDependenciesWindow"),
"videocard" : ("xconfig_gui", "XConfigWindow"),
"monitor" : ("xconfig_gui", "MonitorWindow"),
"xcustom" : ("xconfig_gui", "XCustomWindow"),
"confirminstall" : ("confirm_gui", "InstallConfirmWindow"),
"confirmupgrade" : ("confirm_gui", "UpgradeConfirmWindow"),
"finishxconfig" : None,
"install" : ("progress_gui", "InstallProgressWindow_NEW"),
"bootdisk" : ("bootdisk_gui", "BootdiskWindow"),
"complete" : ("congrats_gui", "CongratulationWindow"),
}
而要谈到以后的调用,我们还得从另外一个文件的列表说起:那就是disptch.py中的
installSteps = [
("welcome", ()),
("betanag", betaNagScreen, ("intf", "dir")),
("language", ("intf", "id")),
("agreement", ("intf", "id", "dispatch")),
("keyboard", ("id.instLanguage.getDefaultKeyboard()", "id.keyboard")),
("checkmonitorok", checkMonitorOK, ("id.monitor", "dispatch")),
("monitor", ("id.xsetup", "id.monitor", "intf")),
("setsanex", setSaneXSettings, ("id.xsetup",)),
("findrootparts", findRootParts, ("intf", "id", "dispatch", "dir", "instPath")),
("findinstall", ("dispatch", "intf", "id", "instPath")),
("installtype", ("dispatch", "id", "method", "intf")),
("zfcpconfig", ("id.zfcp", "id.diskset", "intf")),
("indexmark1", doNothing, ()),
("partitionmethod", ("id.partitions", "id.instClass")),
("partitionobjinit", partitionObjectsInitialize, ("id.diskset",
"id.partitions",
"dir", "intf")),
("partitionmethodsetup", partitionMethodSetup, ("id.partitions",
"dispatch")),
("autopartition", ("id.diskset", "id.partitions", "intf", "dispatch")),
("autopartitionexecute", doAutoPartition, ("dir", "id.diskset",
"id.partitions", "intf",
"id.instClass", "dispatch")),
("fdisk", ("id.diskset", "id.partitions", "intf")),
("fdasd", ("id.diskset", "id.partitions", "intf")),
("partition", ("id.fsset", "id.diskset", "id.partitions", "intf")),
("upgrademount", upgradeMountFilesystems, ("intf", "id.upgradeRoot",
"id.fsset", "instPath")),
("upgradecontinue", queryUpgradeContinue, ("intf", "dir")),
("upgradeswapsuggestion", upgradeSwapSuggestion, ("dispatch", "id",
"instPath")),
("addswap", ("intf", "id.fsset", "instPath",
"id.upgradeSwapInfo", "dispatch")),
("partitiondone", partitioningComplete, ("id.bootloader", "id.fsset",
"id.diskset", "id.partitions",
"intf", "instPath", "dir")),
("upgrademigfind", upgradeMigrateFind, ("dispatch", "id.fsset")),
("upgrademigratefs", ("id.fsset",)),
("upgbootloader", ("dispatch", "id.bootloader")),
("bootloadersetup", bootloaderSetupChoices, ("dispatch", "id.bootloader",
"id.fsset", "id.diskset",
"dir")),
("bootloader", ("dispatch", "id.bootloader", "id.fsset", "id.diskset")),
("bootloaderadvanced", ("dispatch", "id.bootloader", "id.fsset",
"id.diskset")),
("networkdevicecheck", networkDeviceCheck, ("id.network", "dispatch")),
("network", ("id.network", "dir", "intf", "id")),
("firewall", ("intf", "id.network", "id.firewall", "id.security")),
("timezone", ("id.instLanguage", "id.timezone")),
("accounts", ("intf", "id.rootPassword")),
("authentication", ("id.auth",)),
("readcomps", readPackages, ("intf", "method", "id")),
("desktopchoice", ("intf", "id.instClass", "dispatch", "id.grpset")),
("findpackages", upgradeFindPackages, ("intf", "method", "id",
"instPath", "dir")),
("selectlangpackages", selectLanguageSupportGroups, ("id.grpset","id.instLanguage")),
("package-selection", ("id.grpset", "id.instLanguage", "id.instClass", "dispatch")),
("indivpackage", ("id.grpset",)),
("handleX11pkgs", handleX11Packages, ("dir", "intf", "dispatch",
"id", "instPath")),
("handlemiscpkgs", handleMiscPackages, ("intf", "id", "dir")),
("fixupconditionals", fixupConditionals, ("id.grpset",)),
("checkdeps", checkDependencies, ("dir", "intf", "dispatch",
"id", "instPath")),
("dependencies", ("id.grpset", "id.dependencies")),
("confirminstall", ("intf", "id",)),
("confirmupgrade", ("intf", "id",)),
("indexmark2", doNothing, ()),
("install", ("dir", "intf", "id")),
("enablefilesystems", turnOnFilesystems, ("dir", "id.fsset",
"id.diskset", "id.partitions",
"id.upgrade", "instPath")),
("migratefilesystems", doMigrateFilesystems, ("dir", "id.fsset",
"id.diskset", "id.upgrade",
"instPath")),
("setuptime", setupTimezone, ("id.timezone", "id.upgrade", "instPath",
"dir")),
("preinstallconfig", doPreInstall, ("method", "id", "intf", "instPath",
"dir")),
("installpackages", doInstall, ("method", "id", "intf", "instPath")),
("postinstallconfig", doPostInstall, ("method", "id", "intf", "instPath")),
("writeconfig", writeConfiguration, ("id", "instPath")),
("firstboot", firstbootConfiguration, ("id", "instPath")),
("instbootloader", writeBootloader, ("intf", "instPath", "id.fsset",
"id.bootloader", "id.instLanguage",
"id.grpset")),
("bootdisk", ("dir", "dispatch", "id.fsset")),
("makebootdisk", makeBootdisk, ("intf", "dir", "id.floppyDevice",
"id.grpset", "instPath", "id.bootloader")),
#
# we dont use videocard and xcustom currently, they are still listed as
# steps but are not listed in the list of install steps in installclass.py
#
("videocard", ("dispatch", "id.xsetup", "id.videocard", "intf")),
#
# this got moved up to just after mouse config, only runs if monitor probe
# failed. Needs to be here if we enable videocard and xcustom again.
# ("monitor", ("id.xsetup", "id.monitor", "intf")),
("xcustom", ("id.xsetup", "id.monitor", "id.videocard",
"id.desktop", "id.grpset", "id.instClass", "instPath")),
("writexconfig", writeXConfiguration, ("id", "instPath")),
("writeksconfig", writeKSConfiguration, ("id", "instPath")),
("setfilecon", setFileCons, ("instPath","id.partitions")),
("copylogs", copyAnacondaLogs, ("instPath",)),
("dopostaction", doPostAction, ("id", "instPath", "intf")),
("methodcomplete", doMethodComplete, ("method", "id.fsset")),
("dopostpost",doPostpost, ("method","id")),
("complete", ("intf", "id", "dispatch"))
]
同样在dispatch.py中实现了如下的方法:
def currentStep(self):
if self.step == None:
self.gotoNext()
elif self.step >= len(installSteps):
return (None, None)
stepInfo = installSteps[self.step]
step = stepInfo[0]
args = self.bindArgs(stepInfo[1])
return (step, args)
也就是说,当调用此方法时,它的返回返回值就是序列中的第一项,和一个元组。
来看gui.py中的一个调用此方法的方法:
def setScreen (self):
(step, args) = self.dispatch.currentStep() //这就是调用的所要求的返回值
if step is None:
gtk.main_quit() //如果序列中不存在此项,则直接崩溃。
return
if self.dir == 1:
return self.nextClicked()
else:
return self.prevClicked()
(file, className) = stepToClass[step] //这是对字典的操作,即去查询序列的第一项里是否是字典的key值。
newScreenClass = None
s = "from %s import %s; newScreenClass = %s" % (file, className,
className)
#print s
while 1:
try:
exec s
break
except ImportError, e:
print e
win = MessageWindow(_("Error!"),
_("An error occurred when attempting "
"to load an installer interface "
"component.\n\nclassName = %s") % (className,),
type="custom", custom_icon="warning",
custom_buttons=[_("_Exit"),
_("_Retry")]) //如果不存在,则会报这么一个错误。
if not win.getrc():
if flags.rootpath:
msg = _("The installer will now exit...")
buttons = [_("_Exit")]
else:
msg = _("Your system will now be rebooted...")
buttons = [_("_Reboot")]
MessageWindow(_("Rebooting System"),
msg,
type="custom",
custom_icon="warning",
custom_buttons=buttons)
sys.exit(0)
这个字典一直运行在anaconda的生命周期中。应当去注意它的无处不在。
相关阅读 更多 +