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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2887閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/04/11 02:45

編集2018/04/12 04:53

前提・実現したいこと

コンソール上で出力結果を上書きしたいです(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.2‑cp36‑none‑win_amd64.whl

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

python

1# coding: UTF-8 2 3import time 4 5def main(): 6 for i in range(10): 7 print("\r", end="") 8 print(i, end="") 9 time.sleep(0.2) 10 print("") 11 12if __name__ == "__main__": 13 main()

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

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

投稿2018/04/11 04:10

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/11 14:23

回答ありがとうございます。 同じコードを使い回せたほうがスマートですよね。 やはり複数行の出力はできないんですね。。 一応、mac上でcursesモジュールを使って質問にあるコードは書き換えることができたので良かったです。 hayataka2049さん、有難うございましたm(_ _)m
guest

0

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

投稿2018/04/11 04:07

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/11 14:15

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問