ウェブサイト検索

LinuxでPythonを使って端末のサイズを取得する方法


Pythonでコマンドラインアプリケーションを書く際には、端末ウィンドウのサイズを知ることがよく役立ちます。端末の寸法を知ることで、テキスト出力をきれいにフォーマットしたり、ぴったりに収まるプログレスバーを作成したり、利用可能なスペースに応じて反応するユーザーインターフェースを設計したりすることができます。Pythonには端末のサイズを取得するための組み込み関数があり、それを使うことでプログラムをより応答性が高く、視覚的に魅力的にすることができます。

このガイドでは、端末のサイズを取得する方法を学び、この情報のいくつかの実用的な応用例を示します。

Pythonを使って端末ウィンドウのサイズを取得する

実行しているコードの端末サイズを取得するには、Python の os や shutil などのライブラリが提供する関数を使用できます。端末のサイズは通常、行数(行単位)と列数(1 行あたりの文字数)で表されます。

Pythonを使ってそれを行う方法は次のとおりです:

  1. os.get_terminal_size() の使用:この関数は Python 3.3 以降で利用可能です。
  2. shutil.get_terminal_size()の使用: この関数はPython 3.3以降で利用可能で、より一般的に推奨されています。

こちらは shutil.get_terminal_size() を使った例のコードです:

import shutil

def get_terminal_size():
    size = shutil.get_terminal_size()
    return size.columns, size.lines

columns, rows = get_terminal_size()
print(f"Terminal size: {columns} columns and {rows} rows")

コードの説明:

  1. shutilをインポート: このモジュールはファイル操作のための高レベルのインターフェースを提供し、get_terminal_size() 関数を含みます。
  2. ターミナルのサイズを取得する関数を定義する:shutil.get_terminal_size() 関数は、columns と lines の2つの属性を持つ名前付きタプルを返します。
  3. ターミナルのサイズを表示する:列と行の値がターミナルに表示されます。

この方法は、Pythonスクリプトで端末のサイズを取得するために、直接的で効果的です。

これは私のDebianシステムでの上記Pythonコードの出力です:

Terminal size: 80 columns and 24 rows

Pythonを使って端末ウィンドウのサイズを取得する

このコードは以下のようにさらに簡略化できます:

import shutil

# Get the terminal size
terminal_size = shutil.get_terminal_size()

# Print the terminal size
print(f"Terminal size: {terminal_size.columns} x {terminal_size.lines}")

上記のコードの出力は次の通りです:

Terminal size: 80 x 24

上の例では、Pythonのインタラクティブコンソール内でコードを実行しました。なぜなら、例のコードは短くて簡単だからです。

コードをテキストファイルに入れることもできますし、任意のIDEを使ってpythonコマンドで実行することもできます。

そのためには、お気に入りのテキストエディタやIDEを開き、新しいファイルを作成します。例えば、terminal_size.py です。上で示した例のコードのいずれかをコピーして、ファイルに貼り付けます。

ターミナルを開き、terminal_size.py を保存したディレクトリに移動します。以下のように Python インタープリターを使ってスクリプトを実行します。

$ python3 terminal_size.py

Pythonを使用してターミナルサイズを問い合わせる

迅速なテストや学習のために、Pythonコンソールは即時のフィードバックと対話型の性質により非常に便利です。

より大きなスクリプトやプロジェクトの場合、コードをファイルに整理し、python コマンドで実行することが一般的により良いです。この方法は、コードの整理、再利用性、再現性、そして高度な編集ツールへのアクセスをサポートします。

どちらを選ぶかは、タスクの複雑さとあなたの具体的なニーズによります。ソフトウェア開発のベストプラクティスとしては、ファイルにコードを書き、良いテキストエディタやIDEを使用することが推奨されます。

今後は、コードをファイルに入れて、python コマンドを使って実行します。

いくつかの実用的な例

端末のサイズを知ることは、特にコマンドラインアプリケーションやユーザーとやり取りするスクリプトを開発する際に、さまざまなシナリオで有用です。

ここにいくつかの一般的な使用例があります:

1. テキストの書式設定: 出力がターミナルウィンドウ内に適切に収まるようにすること。

これは、行の折り返しを避け、可読性を維持するのに役立ちます。例えば、中央揃えのテキストを印刷するには、次の例のスニペットを使用します。

import shutil

def print_centered(text):
    columns, _ = shutil.get_terminal_size()
    print(text.center(columns))

print_centered("Hello, World!")

コードを実行して、ターミナルウィンドウの中央にテキストを表示します:

$ python3 terminal_size.py 
                                 Hello, World!

2. 動的UI:端末のサイズに応じて動的に調整されるテキストベースのユーザーインターフェース(TUI)を作成すること。

これは、テキストエディタ、ファイルマネージャ、またはダッシュボードのようなツールでよく使用されます。例えば、次のコードはターミナルにボックスを描画します:

import shutil

def draw_box():
    columns, rows = shutil.get_terminal_size()
    print("+" + "-" * (columns - 2) + "+")
    for _ in range(rows - 2):
        print("|" + " " * (columns - 2) + "|")
    print("+" + "-" * (columns - 2) + "+")

draw_box()

ボックスを描画するコマンドでコードを実行してください:

$ python3 terminal_size.py 

3. プログレスバー: ターミナルウィンドウの幅いっぱいに進行状況を表示するプログレスバーを表示します。

これは、ダウンロードやファイル処理などのタスクの進行状況を表示するのに便利です。

import shutil
import time

def show_progress_bar(progress, total):
    columns, _ = shutil.get_terminal_size()
    bar_length = columns - 20
    filled_length = int(bar_length * progress // total)
    bar = '█' * filled_length + '-' * (bar_length - filled_length)
    print(f'\rProgress: |{bar}| {progress}/{total}', end='\r')

total = 100
for i in range(total + 1):
    show_progress_bar(i, total)
    time.sleep(0.1)
print()  # Move to the next line after completion

このコードを実行すると、ターミナルウィンドウにプログレスバーが表示されます:

Pythonで進行状況バーを表示する

4. ロギングとデバッグ:ログ出力を端末ウィンドウに収まるように調整し、開発やデバッグ中にログを読みやすく理解しやすくすること。

例コード:

import shutil

def log_message(message):
    columns, _ = shutil.get_terminal_size()
    if len(message) > columns:
        message = message[:columns - 3] + '...'
    print(message)

log_message("This is a log message that will be truncated if it is too long for the terminal window.")

コード出力:

ログ記録とデバッグ

5. マルチカラムレイアウト: ターミナルの幅に合わせて複数のカラムに整理された出力を作成すること。これはリストや表を表示する際に便利です。

サンプルコード:

import shutil

def print_columns(items, col_width=20):
    columns, _ = shutil.get_terminal_size()
    num_cols = columns // col_width
    for i in range(0, len(items), num_cols):
        print("".join(item.ljust(col_width) for item in items[i:i+num_cols]))

items = ["Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9"]
print_columns(items)

コード出力:

列を印刷

これらの簡単な例は、端末のサイズを知ることで、出力をより適応的で視覚的に魅力的にすることにより、コマンドラインアプリケーションの機能性とユーザー体験を向上させる方法を示しています。

トラブルシューティング

もし何らかの理由で端末のサイズを取得できない場合は、デフォルトの端末サイズを設定することでエラーを適切に処理できます。例えば:

import shutil

def get_terminal_size():
    try:
        size = shutil.get_terminal_size()
    except OSError:
        size = os.terminal_size((80, 24))  # Default size (80 columns, 24 rows)
    return size.columns, size.lines

この場合、get_terminal_size 関数はオプションの fallback パラメータを取ります。提供されない場合、このパラメータはデフォルトで (80, 24) になります。

よくある質問(FAQ)

Q: なぜPythonで端末のサイズを取得する必要があるのですか?

A: ターミナルのサイズを知ることは、出力を整形したり、動的なユーザーインターフェースを作成したり、プログレスバーを表示したり、メッセージをログに記録したり、テキストベースのゲームを設計したりする際に役立ちます。これにより、アプリケーションの出力がユーザーのターミナルウィンドウに適切に収まることを確認できます。

Q: Pythonでターミナルのサイズをどうやって取得できますか?

A: ターミナルの列数と行数を持つ名前付きタプルを返す shutil.get_terminal_size() 関数を使用できます。

Q: どのバージョンの Python が shutil.get_terminal_size() をサポートしていますか?

A: shutil.get_terminal_size() 関数は Python 3.3 以降で利用可能です。

Q: 古いバージョンのPythonで端末のサイズを取得できますか?

A: はい、しかし異なる方法やサードパーティのライブラリを使用する必要があります。例えば、プラットフォーム固有のコマンドと一緒に os モジュールを使用したり、blessed のような外部ライブラリを使用することができます。

Q: 端末のサイズを知ることの実用的な応用例にはどのようなものがありますか?

A: 実用的な応用例には以下が含まれます:
- テキスト出力の中央揃え
- 動的なテキストベースのユーザーインターフェースの作成
- 端末幅に合わせて調整される進行状況バーの表示
- 端末ウィンドウに合わせたログのフォーマット
- テキストベースのゲームやビジュアライゼーションの設計

Q: Pythonスクリプトが端末サイズの変化に適応するようにするにはどうすればよいですか?

A: 現在の端末のサイズを確認し、それに応じて出力を調整するために、定期的にshutil.get_terminal_size()を呼び出すことができます。これは、端末のサイズが実行中に変わる可能性がある長時間実行されるスクリプトやアプリケーションで特に便利です。

Q: shutil.get_terminal_size() を使用する際の制限はありますか?

A: 主な制限は、端末が接続されている場合にのみ機能することです。端末のない環境(例えば、バックグラウンドジョブやサービス)でスクリプトを実行すると、OSError を発生させる可能性があります。

Q: shutil.get_terminal_size() がエラーを出した場合、どうすればよいですか?

A: デフォルトの端末サイズを指定することで、エラーを適切に処理できます。詳細は上記のトラブルシューティングセクションをご覧ください。

Q: エラーが発生した場合、デフォルトのサイズをカスタマイズできますか?

A: はい、デフォルトのサイズは os.terminal_size((80, 24)) の値を変更することで、必要に応じてカスタマイズできます。

結論

このチュートリアルでは、LinuxでPythonの組み込み関数を使ってターミナルのサイズを取得する方法と、いくつかの実用的な例を使った用途について学びました。

ターミナルのサイズを理解することで、よりユーザーフレンドリーなコマンドラインアプリケーションを作成することができます。shutil.get_terminal_size() 関数を使用することで、プログラムの出力を簡単にターミナルウィンドウに合わせて調整することができます。

これにより、アプリケーションの見た目が良くなり、より効率的に動作します。テキストの中央揃え、ボックスの描画、進行状況バーの表示、メッセージの記録、列の印刷など、端末のサイズを知ることで、コマンドラインインターフェースの設計を大幅に向上させることができます。

リソース:

  • Python 3 shutil ドキュメント