Как заставить 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, поэтому буду очень признателен за любое руководство!