39

sys.stderrコンソールかどうかを正しく検出するためにsys.stdout、次のテストを実行しました。

if hasattr(sys.stderr, "isatty") and sys.stderr.isatty():
   if platform.system()=='Windows':
       # win code (ANSI not supported but there are alternatives)
   else:
       # use ANSI escapes
else:
   # no colors, usually this is when you redirect the output to a file

これで、IDE(PyCharmなど)を介してこのPythonコードを実行しているときに、問題がより複雑になりました。最近、PyCharmはANSIのサポートを追加しましたが、最初のテストは失敗します。isatty属性はありますが、に設定されていFalseます。

出力がANSIカラーリングをサポートしているかどうかを正しく検出するように、ロジックを変更したいと思います。1つの要件は、出力がファイルにリダイレクトされるときに、いかなる状況でも何かを出力する必要がないことです(コンソールの場合は許容されます)。

アップデート

https://gist.github.com/1316877に、より複雑なANSIテストスクリプトを追加しました

4

2 に答える 2

23

Django ユーザーはdjango.core.management.color.supports_color関数を使用できます。

if supports_color():
    ...

彼らが使用するコードは次のとおりです。

def supports_color():
    """
    Returns True if the running system's terminal supports color, and False
    otherwise.
    """
    plat = sys.platform
    supported_platform = plat != 'Pocket PC' and (plat != 'win32' or
                                                  'ANSICON' in os.environ)
    # isatty is not always implemented, #6223.
    is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()
    return supported_platform and is_a_tty

https://github.com/django/django/blob/master/django/core/management/color.pyを参照してください

于 2014-03-07T16:02:28.017 に答える
12

他の人がこの問題をどのように解決したかをお話しできますが、それはきれいではありません。例として ncurses (あらゆる種類の異なる端末で実行できる必要があります) を見ると、端末機能データベースを使用してあらゆる種類の端末とその機能を格納していることがわかります。重要なのは、彼らでさえ、これらのものを自動的に「検出」することは決してできなかったということです.

クロスプラットフォームの termcap があるかどうかはわかりませんが、時間をかけて探してみる価値はあるでしょう。そこにある場合でも、端末がリストされていない可能性があり、手動で追加する必要がある場合があります。

于 2011-09-16T13:55:13.273 に答える