Как заставить Python общаться с библиотекой portmidi c в Windows 11/64

Я пытаюсь заставить portmidi работать с Python в Windows 11/64. Я могу скомпилировать dll/lib в MSVS без ошибок, без указания каких-либо изменений или опций. Я новичок в этом, поэтому я не знаю, как сообщить системе о библиотеках, мне нужно поместить их по какому-то пути или что-то в этом роде? Пока я просто сообщаю Python об их местонахождении в каталоге сборки напрямую.

Я хотел бы, чтобы два подхода работали, чтобы сравнить их.

Первый способ: ctypes. Я наткнулся на portmidizero , который выглядит старым и мертвым, но в основном правильным. Я должен 2to3 это и исправить несколько крошечных ошибок, но тогда это почти работает. Бегtestportmidizero.py, Я могуInitialize(), перечислите устройства и получите осмысленные имена, откройтеOutput, и запуститеTime()работает, все без ошибок. Но потом, когда я пытаюсьPm_write(), Я получилOSError: Access Violation. Я работаю от имени администратора. Погуглив, я думаю, что есть проблема либо с соглашениями о вызовах, либо с размерами указателя. Но я не вижу никаких упоминаний илиstdcallгде угодно, поэтому я думаю, что все по умолчаниюcdecl, но я не знаю, как проверить. И я не вижу никаких проблем с тем, как пишутся типы/размеры указателей, но я едва понимаю, что делаю. Что мне делать, чтобы понять, что не так?

Второй способ: Цитон. Насколько я понимаю, этот подход даст наилучшую производительность.  pyportmidi несколько лет назад хорошо работал на Mac, но сейчас он устарел. я пытался получитьpip installработающий:

  • Удалитьdescriptionсвязанные вещи изsetup.pyпотому что ожидаемыйreadmeпропал, отсутствует. То же самое для всего, что связано с тестированием.
  • Я не мог понять, как добавить путь к файлам заголовков portmidi, компилятор не мог их найти, когда я добавлял путь кinclude_dirs, хотя в выводе директивы компилятора это выглядело правильно. Я просто вручную скопировал.hвpyportmidiкаталог на данный момент.
  • Но затем я получил все следующие ошибки, которые я понятия не имею, как решить:
            pyportmidi\_pyportmidi.c(399): warning C4244: 'function': conversion from 'Py_ssize_t' to 'long', possible loss of data
      pyportmidi\_pyportmidi.c(419): warning C4244: 'function': conversion from 'Py_ssize_t' to 'long', possible loss of data
      pyportmidi\_pyportmidi.c(441): warning C4244: 'function': conversion from 'Py_ssize_t' to 'long', possible loss of data
      pyportmidi\_pyportmidi.c(2093): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int32_t', possible loss of data
      pyportmidi\_pyportmidi.c(2625): warning C4113: 'PtTimestamp (__cdecl *)(void)' differs in parameter lists from 'PmTimeProcPtr'
      pyportmidi\_pyportmidi.c(3455): error C2105: '++' needs l-value
      pyportmidi\_pyportmidi.c(3458): error C2105: '--' needs l-value
      pyportmidi\_pyportmidi.c(3634): error C2105: '++' needs l-value
      pyportmidi\_pyportmidi.c(3637): error C2105: '--' needs l-value
      pyportmidi\_pyportmidi.c(4554): warning C4996: 'PyUnicode_GET_SIZE': deprecated in 3.3
      pyportmidi\_pyportmidi.c(4568): warning C4996: 'PyUnicode_GET_SIZE': deprecated in 3.3
      pyportmidi\_pyportmidi.c(5523): warning C4047: 'function': 'PyObject *' differs in levels of indirection from 'int'
      pyportmidi\_pyportmidi.c(5523): warning C4024: 'PyCode_New': different types for formal and actual parameter 14
      pyportmidi\_pyportmidi.c(5525): warning C4047: 'function': 'int' differs in levels of indirection from 'PyObject *'
      pyportmidi\_pyportmidi.c(5524): warning C4024: 'PyCode_New': different types for formal and actual parameter 15
      pyportmidi\_pyportmidi.c(5507): error C2198: 'PyCode_New': too few arguments for call
      pyportmidi\_pyportmidi.c(5534): error C2037: left of 'f_lineno' specifies undefined struct/union '_frame'

Я предполагаю, что это необходимо исправить, отредактировав.pyxсо знанием того, как была обновлена ​​​​библиотека c. Но я не знаю Cython/pyrex, поэтому буду очень признателен за любое руководство!

0 ответов

Другие вопросы по тегам