Windowsコンソールノート—ドキュメントをクリックします

提供:Dev Guides
Click/docs/7.x/wincmd
移動先:案内検索

Windowsコンソールに関する注意事項

バージョン6.0の新機能。


Click 6.0までは、WindowsコンソールでClickを使用することにはさまざまなバグと制限があります。 最も注目すべきは、コマンドライン引数のデコードがPython 2で間違ったエンコードで実行され、すべてのバージョンのPythonでUnicode文字の出力が不可能だったことです。 Click 6.0以降、Windowsで出力ストリームをエミュレートして、個別のAPIを介したWindowsコンソールへのUnicodeをサポートし、パラメーターのさまざまなデコードを実行します。

これがどのように機能するか、そしてそれがあなたにとって何を意味するかについての簡単な概要はここにあります。

Unicode引数

内部的にクリックすることは、一般に、引数はバイト文字列またはユニコード文字列のいずれかとして入力でき、変換は可能な限り遅く期待値の型に実行されるという概念に基づいています。 これには、オペレーティングシステムとPythonバージョンに最適な形式でデータを受け入れることができるため、いくつかの利点があります。

たとえば、Python 2では、特に明記しない限り、パスはバイトとして残されます。

これにより、Windowsでいくつかの問題が発生し、最初は間違ったエンコーディングが使用され、入力データにゴミが残っていました。 エンコード部分を修正しただけでなく、 sys.argv からUnicodeパラメーターを抽出するようになりました。

これは、WindowsのPython 2では、処理される引数がほとんどの場合バイトではなくUnicodeの性質であることを意味します。 これは、Unicodeパラメータを明示的に渡さない限り、以前は実際には発生しなかったため、カスタムタイプはこれを認識する必要があります。

これには別の制限もあります。クリックハンドラーを呼び出す前に sys.argv が変更された場合、通常のバイト入力にフォールバックする必要があります。この場合、すべてのUnicode値が使用可能ではなく、サブセットのみが使用可能です。パラメータに使用されるコードページの。


Unicodeの出力と入力

WindowsでのUnicodeの出力と入力は、テキストストリームのディスパッチの概念を通じて実装されます。 これが意味するのは、クリックが最初にWindowsでテキスト出力(または入力)ストリームを必要とするとき、Windowsコンソールが接続されているかどうかを確認するためにいくつかのチェックを通過するということです。 Windowsコンソールが存在しない場合、テキスト出力ストリームはそのまま返され、そのストリームのエンコーディングは、すべてのプラットフォームと同様にutf-8に設定されます。

ただし、コンソールが接続されている場合は、代わりにストリームがエミュレートされ、cmd.exeユニコードAPIを使用してテキスト情報が出力されます。 この場合、ストリームは内部エンコーディングとしてutf-16-leも使用します。 ただし、基になるraw IOバッファがまだUnicodeAPIをバイパスしており、間接参照によるバイト出力が引き続き可能であるというハッカーが発生しています。

このハッカーはPython2とPython3の両方で使用されます。これは、どちらのバージョンのPythonもUnicode文字を使用したcmd.exeをネイティブでサポートしていないためです。 注意する必要のあるいくつかの制限があります。

  • このUnicodeサポートは、click.echoclick.prompt、およびclick.get_text_streamに制限されています。
  • Unicode値またはバイト文字列が渡されるかどうかに応じて、制御フローは内部で完全に異なる場所に移動し、データが部分的にバッファリングされると、奇妙なアーティファクトが発生する可能性があります。 クリックは常に手動でフラッシュすることでそれを防止しようとしますが、異なる文字列タイプをstdoutまたはstderrに混合して一致させる場合は、手動でフラッシュする必要があります。
  • 生の出力ストリームは、Windowsのグローバル操作であるバイナリモードに設定されているため、print呼び出しが影響を受けます。 printよりもclick.echoを優先します。
  • Windows 7以下では、バイナリモードで1回の呼び出しで最大64k文字を書き込むことができるという制限があります。 この状況では、sys.stdoutsys.stderrは、制限を回避するラッパーに置き換えられます。

注意すべきもう1つの重要な点は、Windowsコンソールのデフォルトのフォントは多くの文字をサポートしていないことです。つまり、ほとんどの場合、国際文字に制限されていますが、絵文字や特殊文字はサポートされていません。