4

Pythonのスクリプトのような簡単なセットアップウィザードを書いています。基本的に、ユーザーにいくつかの値を入力し、いくつかのはい/いいえの質問に答えるように促します。次に、ユーザー入力に基づいて、スクリプトはディレクトリの作成、構成ファイルの作成と初期化、シンボリックリンクの作成、アクセス許可の設定などを行います。

ユーザーが選択を行うと、さまざまなパスが使用され、ディレクトリの構造とシンボリックリンクの存在が異なる場合があります。各ステップで多くの問題が発生する可能性があり、ユーザーが入力を変更したり、すべてをロールバックしたりする必要があります。

1-これは、このスクリプトを作成するための最良のアプローチですか?このテキストメニュー設定ウィザードはまったく良い考えですか?

2-車輪の再発明をしないように、これを簡単にするのに役立つモジュールはありますか?

3-ユーザーが選択するときに実際に各ステップを実行する必要がありますか、それとも最後まで待ってすべてを一度に実行する必要がありますか?

4-ロールバック関数を記述できるように、作成済みの構造を覚えておくための最良の方法は何ですか?

答えとしてコードは必要ありません。提案、意見、外部リンクをいただければ幸いです。

4

1 に答える 1

3

私はGUIのことはしません。あなたはそれを書くことができます、しかしあなたがこれを完全にコマンドラインで行うとしましょう。

  1. 物理的な副作用を起こす前に、すべてのユーザー入力を取り込むことをお勧めします。つまり、ユーザーがすべてのオプションを完了するまで、ディレクトリの作成を開始しないでください。PythonドキュメントツールSphinxが良い例です。ユーザーが起動すると、ユーザーに多くの質問をしますquickstart。Sphinxは、最後まで物理ディレクトリと構成ファイルを生成しません。これにより、疲れていることを「覚えておく」必要がなくなります。ブランチが多すぎます。そうしないでください。最後にセットアップ全体を実行します。

  2. 依存します。単純なコマンドラインインターフェイスを作成したい場合、Pythonにはコマンドラインオプションを作成するためのargpaseがあります。上記は、argparseの上に構築されたdocoptライブラリを使用して可能になります。ただし、これはコマンドラインが必要な場合に便利です。スクリプトで「pythonscript.py」を呼び出してからユーザーに質問するだけでよい場合、セットアップを処理する便利なライブラリはわかりません。

実は開発中だったのdcopromptですが、まだ完成していません。https://bitbucket.org/yeukhon/docprompt 基本的には、セットアッププロンプトを書き留めて、覚えておくことができるはずでした。コードベースはひどいもので、あまり効率的ではありません。試すことはできますが、今学期は宿題が多いため、夏まで機能を終了しません。

したがって、答えはノーです。コードは自分で作成する必要があります。たくさんの生の入力とたくさんの変数。

  1. 繰り返しますが、副作用が出るまで最後まで待ちます。

  2. 繰り返しますが、副作用が出るまで最後まで待ちます。


編集

ディレクトリとシンボリックリンクの作成が終了するまで待ち、IOErrorが発生したステップの1つで、セットアップ全体を元に戻したいとします。作成しているのがディレクトリ、ファイル、シンボリックリンクだけの場合は、それらをリストの辞書に追加します。私の編集を参照してください。

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)

重要:上記のコードには1つの問題があります。フォルダを削除する前に、リンクを解除し、ファイルとdirを削除する必要があります。ファイルがすでに削除されたディレクトリの一部である場合は、例外をサイレントにキャッチする必要があるためです。たくさんのコード。リンクを解除し、ファイルとディレクトリを削除するだけです。

于 2013-03-24T17:58:07.830 に答える