質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

[Python]ctypesを使ってコンソール制御をしたい(Mac)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,161

.me

score 17

 前提・実現したいこと

コンソール上で出力結果を上書きしたいです(Mac)。
Windowsでは以下のコードで動作することができました。

import os
import time
import ctypes

os.system('cls')
STD_OUTPUT_HANDLE = -11
h = ctypes.windll.kernel32.GetStdHandle(ctypes.c_long(STD_OUTPUT_HANDLE))

c = 0
while True:
    ctypes.windll.kernel32.SetConsoleCursorPosition(h, ctypes.c_ulong(0))
    text = '-' * 11 + '\n'
    text += '|    ' + str(c) + '    |\n'
    text += '-' * 11
    print(text)

    c += 1
    time.sleep(0.5)

 発生したエラー

Macで同じように動作しようとしましたが、以下のエラーが発生しました。

import os
import ctypes

os.system('clear')
libc=ctypes.CDLL("libSystem.B.dylib")
libc.GetStdHandle(ctypes.c_long(-11))
AttributeError: dlsym(0x10efe97c8, GetStdHandle): symbol not found

上のエラーは読み込むライブラリに関数(GetStdHandle)が含まれていないために発生したものだと思うのですが、c++の関数?を扱うためのライブラリ?dll?を読み込むために、自分でファイルを作成するのか、サイトからダウンロードすればいいのかわからない状況です。ご教授頂ければ幸いです。

 補足情報

macOS High Sierra バージョン10.13.4
Python 3.6.4

C言語詳しくないです

 参考にしたサイト

コンソールのクリア、カーソル制御
16.16. ctypes — Pythonのための外部関数ライブラリ
OSXのlibcはlibSystem.B.dylibなのかも
C/C++で作成したDLLのテストをPythonで行う

 追記(2018/4/12 14:00)「Windowsでcursesモジュールのインポート」

Windowsでcursesモジュールを以下のサイトでimportできました。
Unofficial Windows Binaries for Python Extension Packages

ファイル名の意味についてはこちらを参考に
What does version name 'cp27' or 'cp35' mean in Python?

.whlファイルをインストールする際にエラーが出る場合はこちらを参考に
filename.whl is not a supported wheel on this platform

自分の場合はファイルのあるディレクトリ上で以下を実行してインストールできました。

> pip install curses‑2.2cp36nonewin_amd64.whl
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

windowsのapiを直接叩くのはあまり上手いやり方ではありませんし、移植性もありません。macでその方法は使えないと思ってください。

一行の上書きでよければ、単にキャリッジリターンを使えば行うことができます。

# coding: UTF-8

import time

def main():
    for i in range(10):
        print("\r", end="")
        print(i, end="")
        time.sleep(0.2)
    print("")

if __name__ == "__main__":
    main()

あるいは、cursesを使うのも手です。

16.10. curses — 文字セル表示を扱うための端末操作 — Python 3.6.5 ドキュメント 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/11 23:23

    回答ありがとうございます。

    同じコードを使い回せたほうがスマートですよね。

    やはり複数行の出力はできないんですね。。
    一応、mac上でcursesモジュールを使って質問にあるコードは書き換えることができたので良かったです。

    hayataka2049さん、有難うございましたm(_ _)m

    キャンセル

+2

cursesのようなモジュールを利用してみては?
各OSの実装を気にせず使えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/11 23:15

    回答ありがとうございます。

    cursesモジュールを使って、質問にあるコードをMacで実行することができました。ただ、Windowsでcursesモジュールを試してみましたが、サイトにもあるとおり、Windows版Pythonではcursesモジュールはないようで、モジュールをインポートしようにも、`import curses`→`ModuleNotFoundError: ...`と出力されました。
    他にサイト内で提案されているモジュールとして「Unicurses」を試してみましたが、dllがないと`ImportError`と出力されました。まだ手を付けてはいませんが、「the Console module」をダウンロードして試してみようと思います。

    can110さん、有難うございましたm(_ _)m

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる