3

Windows 8、64ビットでPythonを使用してデフォルトのコンソールカラーを取得しようとしています:

class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
    _fields_ = [('dwSize', wintypes._COORD),
                ('dwCursorPosition', wintypes._COORD),
                ('wAttributes', c_ushort),
                ('srWindow', wintypes._SMALL_RECT),
                ('dwMaximumWindowSize', wintypes._COORD)]

...

def __init__(self):
        self.stdout_handle = windll.kernel32.GetStdHandle(-11) # STD_OUTPUT_HANDLE
        print self.stdout_handle # 28

        csbi   = CONSOLE_SCREEN_BUFFER_INFO()
        print sizeof(csbi) # 22
        retval = windll.kernel32.GetConsoleScreenBufferInfo(self.stdout_handle, byref(csbi))
        print windll.kernel32.GetLastError()
        print csbi.wAttributes, " (%s)" % bin(csbi.wAttributes)

        if retval == 0:
            formatwinerror() # A helper function

対話型インタープリター (オブジェクトのインポートと作成) を使用すると、最後のエラー コード 6 (無効なハンドル) と属性 0 で Python 2.7.5 を使用すると失敗します。同じコード Python 3.3.2 を実行すると、動作します (エラーコード 0 と属性 0xf (デフォルト)。興味深いことに、Python 2.7.5 を使用し、代わりに次のコードを使用すると、動作します。

import struct

...Same as before...

csbi = create_string_buffer(22)
retval = windll.kernel32.GetConsoleScreenBufferInfo(self.stdout_handle, csbi)
width, height, curx, cury, wattr, left, top, right, bottom, maxx, maxy = struct.unpack("hhhhHhhhhhh", csbi.raw)

print wattr, " (%s)" % bin(wattr)

...Same as before...

追加のデバッグのために、呼び出しのコアを別のスクリプトにコピーし (クラス外の関数内でも試しました)、両方のバージョンのコマンド ラインで完全に実行されるようになりました。ただし、GetStdHandle の呼び出しの前にこの行を追加すると、別のスクリプトは Python 2.7.5 では失敗しますが (ここから)、対話型インタープリターを使用すると失敗します。

windll.kernel32.GetStdHandle.restype = wintypes.HANDLE

Python 3.3.2 の場合、関係なくすべてが機能するようです。私は検索され、読んで、他の Python モジュールを見て、一晩中自分のコードをレビューしていましたが、運がなかったのです...一体何が起こっていて、何が欠けているのでしょうか?

4

1 に答える 1

1

Python インタープリターがどのようなアーキテクチャーでコンパイルされているかは考慮していませんでした。

コードに行を追加するwindll.kernel32.GetConsoleScreenBufferInfo.argtypes = [wintypes.HANDLE, ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO)]と、すべてのインタープリターで機能します。Python 3.3.2 (64 ビット アーキテクチャ) が動作する理由をまだ説明できませんが、おそらく Python 3.x の変更が原因であると思います。

于 2014-05-09T10:44:24.660 に答える