4

我正在编写一个简单的设置向导,例如 Python 中的脚本。基本上它会提示用户输入一些值并回答一些是/否问题。根据用户输入,脚本将创建目录、创建和初始化配置文件、创建符号链接、设置权限等。

当用户做出选择时,会采用不同的路径,目录结构和符号链接的存在可能会有所不同。每个步骤都可能出现许多问题,可能需要用户更改他们的输入或回滚整个事情。

1 - 这是编写此脚本的最佳方法吗?这个文本菜单设置向导是个好主意吗?

2-是否有一个模块可以帮助简化这个过程,这样我就不会重新发明轮子?

3-我应该在用户做出选择时实际执行每个步骤还是等到最后一次做所有事情?

4-记住已经创建的结构以便我可以编写回滚函数的最佳方法是什么?

我不想要任何代码作为答案;感谢任何建议、意见或外部链接。

4

1 回答 1

3

我不做 GUI 的东西。您可以编写一个,但假设您完全在命令行上执行此操作。

  1. 我建议在产生物理副作用之前接受所有用户输入。换句话说,在用户完成所有选项之前不要开始创建目录。Python 文档工具 Sphinx 就是一个很好的例子。当用户启动时,它会询问用户许多问题quickstart。Sphinx 直到最后才生成物理目录和配置文件。这样就省去了“记住”的累人。分支太多。不要那样做。在最后完成整个设置。

  2. 要看。如果你想制作一个简单的命令行界面,Python 有 argpase 来制作命令行选项。使用构建在 argparse 之上的docopt库可以实现上述操作。但是,如果您想拥有命令行,这很有用。如果您的脚本只需要调用“python script.py”然后开始询问用户问题,我不知道有任何有用的库可以处理设置内容。

实际上我正在开发一个,dcoprompt但它还没有完成。https://bitbucket.org/yeukhon/docprompt 基本上它应该允许你写下你的设置提示然后记住它们。代码库很糟糕,效率不高。你可以试试,但由于这个学期的作业量很大,我要到夏天才能完成这个功能。

所以答案是否定的。您必须自己编写代码。只是很多原始输入和很多变量。

  1. 再次,等到最后产生副作用。

  2. 再次,等到最后产生副作用。


编辑

假设您等到最后创建目录和符号链接,并且在其中一个步骤 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)

重要:上面的代码有一个问题,您应该在删除文件夹之前取消链接、删除文件和目录。因为如果文件是已删除目录的一部分,您将不得不静默捕获异常。很多代码。只需取消链接,删除文件和目录。

于 2013-03-24T17:58:07.830 回答