立論.

パラメータの働き方は options しかし全部席があります。その文法的性質のため,オプション機能のサブセットのみをサポートしている.クリックしても論点を記録してみませんので、 document them manually 見にくいヘルプページを避けるために。

基本論点.

最も基本的なオプションは、値の簡単な文字列パラメータです。タイプが提供されていない場合はデフォルト値のタイプを使用し、デフォルト値が提供されていない場合はタイプを仮定する STRING それがそうです。

例:

@click.command()
@click.argument('filename')
def touch(filename):
    """Print FILENAME."""
    click.echo(filename)

どのように見えるのでしょうか

$ touch foo.txt
foo.txt

可変パラメータ.

第2の最も一般的なバージョンは、特定の(または無制限)数のパラメータを受け入れることができる可変パラメータである。これは使えます nargs パラメータもしそれが -1 したがって,数に制限されないパラメータが受け入れられる.

そして,この値をタプルとして渡す.1つのパラメータしか設定できませんのでご注意ください nargs=-1 全ての議論を食べてしまうからです

例:

@click.command()
@click.argument('src', nargs=-1)
@click.argument('dst', nargs=1)
def copy(src, dst):
    """Move file SRC to DST."""
    for fn in src:
        click.echo(f"move {fn} to folder {dst}")

どのように見えるのでしょうか

$ copy foo.txt bar.txt my_folder
move foo.txt to folder my_folder
move bar.txt to folder my_folder

これはあなたがこのアプリケーションを作成する方法ではないことに注意してください。これは,この特定の例では,パラメータが文字列として定義されているためである.しかし、ファイル名は文字列ではありません!これらはいくつかのオペレーティングシステムにインストールされる可能性があるが,必ずしもすべてのオペレーティングシステムに実装されているとは限らない.本稿を作成するより良い方法については,次節を参照されたい.

非空変数引数に関する注記

もしあなたが来たら argparse 設定のサポートが不足している可能性があります nargs 至る + 少なくとも1つのパラメータが必要であることを示すために。

これは設定によってサポートされています required=True それがそうです。しかし,これを避けることができれば,変数パラメータが空であれば,足は優雅にNoopsに格下げされるべきであると考えられるからである.なぜなら,スクリプトは通常命令行中のワイルドカードで呼び出しを入力し,ワイルドカードが空であればスクリプトを誤ってはならないからである.

ファイルパラメータ

すべての例でファイル名が使用されているため、ファイルを正しく処理する方法を説明することは意味がある。命令ラインツールは、Unix方式でファイルを処理する(すなわち、受信する) - Stdin/stdoutを参照する特殊なファイルとします。

クリックして通過します click.File ファイルの種類をスマートに処理させていただきます。これはまた、すべてのバージョンのPythonのUnicodeとバイトを正確に処理することができるため、あなたのスクリプトは非常にポータビリティを維持しています。

例:

@click.command()
@click.argument('input', type=click.File('rb'))
@click.argument('output', type=click.File('wb'))
def inout(input, output):
    """Copy contents of INPUT to OUTPUT."""
    while True:
        chunk = input.read(1024)
        if not chunk:
            break
        output.write(chunk)

その役割を果たしています

$ inout - hello.txt
hello
^D
$ inout hello.txt -
hello

ファイルパスパラメータ

前の例では、ファイルはすぐに開きます。しかしもし私たちがファイル名だけが必要なら?無邪気な方法はデフォルトの文字列パラメータタイプを使用することである.ただし,ClickはUnicodeに基づいているため,文字列はつねにUnicode値であることを覚えておいてください.残念ながら、ファイル名は、使用されるオペレーティングシステムに特に依存するUnicodeまたはバイトであってもよい。したがって、タイプは十分ではない。

逆に、あなたは使用すべきです Path タイプは,この曖昧性を自動的に処理するバイトまたはUnicodeに戻るだけでなく、どれがより意味があるかに依存して、チェックが存在するかどうかなど、いくつかの基本的なチェックを実行することもできます。

例:

@click.command()
@click.argument('filename', type=click.Path(exists=True))
def touch(filename):
    """Print FILENAME if the file exists."""
    click.echo(click.format_filename(filename))

その役割を果たしています

$ touch hello.txt
hello.txt

$ touch missing.txt
Usage: touch [OPTIONS] FILENAME
Try 'touch --help' for help.

Error: Invalid value for 'FILENAME': Path 'missing.txt' does not exist.

ファイルを開けて安全

♪the FileType タイプには処理されなければならない問題があり、それはいつファイルを開くかを決定することだ。デフォルトの行動はそれに対して“知能”を維持することだ。これは、stdin/stdoutをすぐに開き、開いたファイルを読み込むことを意味します。これは,ファイルが開くことができない場合にはユーザに直接フィードバックを提供するが,IO操作を初めて実行した場合にのみ,ファイルを特殊なパッケージに自動的にカプセル化することで書き込むファイルを開く.

この行動は伝達することで lazy=True あるいは…。 lazy=False 構造関数に伝達する。ファイルが遅延して開くと、最初のIO動作は失敗します。 FileError それがそうです。

書き込まれたファイルを開くと通常すぐにファイルが空になるため、開発者がこれが予想される行為であると絶対に判断した場合にのみ、不活性モードを無効にすべきである。

強制不活性モデルは資源処理の混乱を避けるためにも非常に有用だ。不活性モードでファイルを開くと、それは受け取ります close_intelligently 方法は、ファイルが閉じる必要があるかどうかを決定するのを助けることができる。これはパラメータには必要ではないが,使用には prompt() 関数は、stdoutのようなストリームが開いている(前に開いていた)のか、閉じている必要がある実際のファイルなのか分からないからです。

Click 2.0からは,以下のように原子モードでファイルを開くことも可能である. atomic=True それがそうです。原子モードでは、すべての書き込み操作は、同じフォルダ内の1つの個別ファイルに入れられ、完了すると、そのファイルは元の位置に移動する。他のユーザが定期的に読み取ったファイルを修正すれば,この機能は非常に有用である.

環境変数

オプションと同様に,パラメータも環境変数から値を得ることができる.しかし,オプションと異なるのは,明示的に命名された環境変数のみをサポートしていることである.

例示的な用法:

@click.command()
@click.argument('src', envvar='SRC', type=click.File('r'))
def echo(src):
    """Print value of SRC environment variable."""
    click.echo(src.read())

コマンドラインから以下の動作を実行する。

$ export SRC=hello.txt
$ echo
Hello World!

この場合、第1の環境変数を選択する異なる環境変数のリストであってもよい。

一般に,この機能の利用は推奨されておらず,ユーザに多くの迷いを与えるためである.

クラスオプションパラメータ

時々、あなたはオプションのように見えるパラメータを処理することを望んでいる。例えばあなたが名前を持っているとしましょう -foo.txt それがそうです。このようにパラメータとして渡すと,Clickはオプションと見なす.

この問題を解決するために,ClickはどのPOSIXスタイルのコマンドラインスクリプトでも実行される操作,すなわち文字列を受け取る. -- オプションとパラメータの区切りとする.後 -- タグ付け時には,他のすべてのパラメータがパラメータとして受け入れられる.

例示的な用法:

@click.command()
@click.argument('files', nargs=-1, type=click.Path())
def touch(files):
    """Print all FILES file names."""
    for filename in files:
        click.echo(filename)

コマンドラインから以下の動作を実行する。

$ touch -- -foo.txt bar.txt
-foo.txt
bar.txt

もしあなたが好きでなければ -- フラグを付ける際には、未知のオプションのチェックを回避するために、IGNORE_UNKNOWN_OPTIONSをTrueに設定することができる:

@click.command(context_settings={"ignore_unknown_options": True})
@click.argument('files', nargs=-1, type=click.Path())
def touch(files):
    """Print all FILES file names."""
    for filename in files:
        click.echo(filename)

コマンドラインから以下の動作を実行する。

$ touch -foo.txt bar.txt
-foo.txt
bar.txt