Использование ctypes с Jython - PullRequest
4 голосов
/ 04 марта 2011

У меня проблема с использованием ctypes lib в моем скрипте python.Вот мой код (найден в Интернете):

if __name__ == "__main__":
    from ctypes import *
    user32 = windll.user32
    kernel32 = windll.kernel32

    class RECT(Structure):
        _fields_ = [
            ("left", c_ulong),
            ("top", c_ulong),
            ("right", c_ulong),
            ("bottom", c_ulong)];

    class GUITHREADINFO(Structure):
        _fields_ = [
        ("cbSize", c_ulong),
        ("flags", c_ulong),
        ("hwndActive", c_ulong),
        ("hwndFocus", c_ulong),
        ("hwndCapture", c_ulong),
        ("hwndMenuOwner", c_ulong),
        ("hwndMoveSize", c_ulong),
        ("hwndCaret", c_ulong),
        ("rcCaret", RECT)
        ]

    def moveCursorInCurrentWindow(x, y):
        # Find the focussed window.
        guiThreadInfo = GUITHREADINFO(cbSize=sizeof(GUITHREADINFO))
        user32.GetGUIThreadInfo(0, byref(guiThreadInfo))
        focussedWindow = guiThreadInfo.hwndFocus

        # Find the screen position of the window.
        windowRect = RECT()
        user32.GetWindowRect(focussedWindow, byref(windowRect))

        # Finally, move the cursor relative to the window.
        user32.SetCursorPos(windowRect.left + x, windowRect.top + y)

    if __name__ == '__main__':
    # Quick test.
        moveCursorInCurrentWindow(100, 100)

Первая проблема заключалась в том, что python не смог найти ctypes, поэтому я скопировал файлы, загруженные с сайта проекта, в

netbeans\6.9\jython-2.5.1\Lib\

(да, я использую NetBeans), а затем он показывает эту ошибку:

>    from ctypes import *
>  File "C:\Users\k\.netbeans\6.9\jython-2.5.1\Lib\ctypes\__init__.py", line 10, in <module>
>    from _ctypes import Union, Structure, Array

Так же, как в файле инициализации есть некоторые ошибки o_O Помогите, ребята!Привет, Крис

Ответы [ 4 ]

7 голосов
/ 04 марта 2011

ctypes в Jython экспериментальная и не полная.

Из списка рассылки пользователей jython в теме под заголовком « ctypes в Jython » Джим Бейкер (коммиттер Jython) написал 17 ноября 2010 года:

Есть некоторая экспериментальная поддержка ctypes в 2.5.2 [текущая версия], но это действительно больше заполнителя в этой точке.

Затем он предлагает эти обходные пути:

Я рекомендую JNA, если вы можете изменить ваш код ctypes. JNA довольно близко к типам - API JNA, видимо, был значительно зависит от ctypes! JNA также, кажется, хорошо работает с Jython.

Другой вариант - использовать что-то как execnet. Для execnet в частности: он позволяет вам создавать пары Jython с CPython, и это кажется работать хорошо. Но его лицензия GPL делает это не стартером для многих люди. Есть и другие варианты там тоже.

Далее в той же ветке мы имеем эту подтверждающую оценку:

Я попробовал модуль ctypes в 2.5.2rc2 недавно и обнаружил, что: 1) пока нет ctypes.util.find_library 2) ctypes.Structure не поддерживает нескалярных типов пока нет

Так что я согласен с "более заполнитель "оценка. Тем не менее, это интересно видеть, как это начинается.

3 голосов
/ 04 марта 2011

ctypes не поддерживается в Jython 2.5.1.В 2.5.2 была добавлена ​​некоторая экспериментальная поддержка, но она, конечно, еще далеко не завершена.Возможно, вам повезет больше, если вместо этого использовать JNA с Jython.Здесь есть краткое руководство .

1 голос
/ 04 марта 2011

Jython пока не имеет полной поддержки ctypes: http://bugs.jython.org/issue1328

Вы не можете просто взять библиотеку ctypes, скомпилированную для CPython, и вставить ее в Jython.

0 голосов
/ 05 марта 2011

Хорошо, спасибо!Я просто перенастроил свой NetBeans, теперь он использует cPython.Все работает.Мне просто пришлось изменить строку user32.SetCursorPos(windowRect.left + x, windowRect.top + y) на: user32.SetCursorPos(c_ulong(windowRect.left + x), c_ulong(windowRect.left + y))

...