Julia PyCall трудности с запуском модулей Music21 - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок, испытывающий трудности с использованием PyCall Джулии для взаимодействия с музыкальным модулем MIT Python music21.

Согласно веб-сайту Music21, чтобы отобразить короткую мелодию в музыкальной нотации, наберите в Python:

converter.parse("tinynotation: 3/4 c4 d8 f g16 a g f#").show()

Вот что я сделал, чтобы попытаться выполнить этот код в Юлии:

Сначала я инициализировал music21, который, казалось, работал:

@pyimport music21
music21: Certain music21 functions might need these optional packages: matplotlib, scipy; if you run into errors, install them by following the instructions at http://mit.edu/music21/doc/installing/installAdditional.html

Затем я попытался воссоздать приведенный выше пример Python в Julia, набрав:

converter.parse ("tinynotation: 3/4 c4 d8 f g16 a g f #"). Show ()

I received this error:
ERROR: UndefVarError: converter not defined
Stacktrace:
 [1] eval(::Module, ::Any) at ./boot.jl:235

ОБНОВЛЕНИЕ 1 Согласно предложению rickhg12hs, я попытался music21.converter.parse («tinynotation: 3/4 c4 d8 f g16 a g f #»). Show ().

Теперь я получаю это сообщение об ошибке 'Parse': ОШИБКА: тип PyObject не имеет анализа поля. Stacktrace: 1 eval (:: Module, :: Any) в ./boot.jl:235

Кажется, это улучшение, так как теперь он чуть позже падает в цепочке кода, в «Parse» вместо «Converter».

ОБНОВЛЕНИЕ 2 - ИСПРАВЛЕНО Эта проблема связана с точечной перегрузкой . Основываясь на этой ссылке, я попытался изменить свой код, чтобы он выглядел так:

music21.converter[:parse]("tinynotation: 3/4 c4 d8 f g16 a g f#")[:show]()

но теперь я получаю эту ошибку

FSPathMakeRef(/Applications/MuseScore 2.app/Contents/MacOS/mscore) failed with error -43.

Я обнаружил, что последнее, что мне нужно было сделать, это загрузить MuseScore, и теперь проблема решена!

См. Ответ @ crstnbr для получения дополнительной информации о уродстве этого решения и предстоящих исправлениях.

Большое спасибо! Накул

1 Ответ

0 голосов
/ 06 сентября 2018

У меня не установлен пакет (я протестирую его через секунду), но должно работать следующее:

@pyimport music21 as m
m.converter[:parse]("tinynotation: 3/4 c4 d8 f g16 a g f#")[:show]() 

Обратите внимание, что возможно уродливый (но систематический) доступ [:fieldname] скоро исчезнет в Julia 1.0 после того, как мой запрос на извлечение здесь будет объединен. Причина этого синтаксиса в том, что Джулия не позволила переопределить функциональность доступа .. Это, к счастью, изменилось в Юлии 1.0.

...