我正在编写一个简单的安装向导,就像Python中的脚本一样。基本上它会提示用户输入一些值并回答一些是/否问题。根据用户输入,脚本将创建目录,创建和初始化配置文件,创建符号链接,设置权限等。
当用户做出选择时,会采用不同的路径,目录的结构和符号链接的存在可能会有所不同。每个步骤都可能出现许多问题,可能需要用户更改输入或回滚整个事件。
1 - 这是编写此脚本的最佳方法吗?这个文本菜单设置向导是一个好主意吗?
2-是否有一个模块可以帮助使这更简单,以便我不重新发明轮子?
3-我应该在用户做出选择时实际执行每一步还是等到最后并一次完成所有操作?
4-记住已创建结构的最佳方法是什么,以便我可以编写回滚函数?
我不希望任何代码作为答案;任何建议,意见或外部链接都表示赞赏。
答案 0 :(得分:2)
我不做GUI的东西。你可以写一个,但是假设你完全在命令行上这样做。
我建议在进行物理副作用之前先接受所有用户输入。换句话说,在用户完成所有选项之前,不要开始创建目录。
Python文档工具Sphinx就是一个很好的例子。当用户启动quickstart
时,它会向用户询问许多问题。 Sphinx直到最后才生成物理目录和配置文件。这消除了“记住”累人的需要。分支太多了。不要那样做。在最后完成整个设置。
取决于。如果你想创建一个简单的命令行界面,Python有argpase来创建命令行选项。使用构建在argparse之上的docopt库可以实现上述目的。但是,如果您想拥有命令行,这将非常有用。如果你的脚本只需要调用“python script.py”然后开始询问用户问题,我就不知道任何有用的库来处理设置内容。
实际上我正在开发一个名为dcoprompt
但尚未完成的版本。 https://bitbucket.org/yeukhon/docprompt基本上它应该允许你写下你的设置提示,然后记住它们。代码库很糟糕,效率不高。你可以尝试,但由于本学期繁重的家庭作业负荷,我不会在夏天之前完成这项功能。
所以答案是否定的。你必须自己编写代码。只是很多原始输入和很多变量。
再次,等到最后才产生副作用。
再次,等到最后才产生副作用。
修改强>
假设您等到最后创建目录和符号链接,并且在其中一个步骤IOError发生时,您要撤消整个设置。如果您要创建的只是目录,文件和符号链接,请将它们添加到列表字典中。看我的编辑。
def physical_setup(...):
memory = {
'dirs': [],
'symlinks': [],
'files': []
}
try:
# start doing physical setup
memory['dirs'].append('/tmp/dir1')
os.path.mkdir('/tmp/dir1')
# catching all exceptions is considered a bad practice but sometimes be a little badass
except Exception as e:
for key, valist in memory.iteritems():
if key == 'dirs':
for dir in valist:
shutil.rmtree(dir)
重要:上面的代码有一个问题,您应该在删除文件夹之前取消链接,删除文件和目录。因为如果文件是已删除目录的一部分,则必须以静默方式捕获异常。很多代码。只需取消链接,删除文件和目录。