【问题标题】:Julia PyCall difficulties in running modules of Music21Julia PyCall 在运行 Music21 模块时遇到困难
【发布时间】:2025-12-29 03:25:12
【问题描述】:

我是一名初学者,在使用 Julia 的 PyCall 与 MIT Python 音乐模块 music21 交互时遇到困难。

根据 Music21 的网站,为了以乐谱显示短旋律,可以在 Python 中输入:

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

这是我尝试在 Julia 中执行此代码的操作:

我首先初始化了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

然后我尝试通过键入以下内容在 Julia 中重新创建上述 Python 示例:

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()。

现在我在“解析”上收到此错误消息:错误:类型 PyObject 没有字段解析 Stacktrace:1 eval(::Module, ::Any) at ./boot.jl:235

这似乎是一种改进,因为它现在在代码链中稍后崩溃,在“Parse”而不是“Converter”。

更新 2 - 已修复 这个问题与dot overloading 有关。 基于此链接,我尝试将代码修改为如下所示:

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 的回答。

非常感谢! 纳库尔

【问题讨论】:

  • 我从来没有使用过这个 Python 包(你会因为我弹吉他而畏缩),但我想知道如果你尝试 music21.converter.parse("tinynotation: 3/4 c4 d8 f g16 a g f#").show() 会发生什么。
  • 这是我第一次使用 PyCall。您的建议可能会稍微改善一下情况。现在我在“解析”上收到此错误消息:错误:类型 PyObject 没有字段解析堆栈跟踪:[1] eval(::Module, ::Any) at ./boot.jl:235
  • 您会编辑您的问题以包含这些新信息吗?它可以帮助以后可能会查看此问题的每个人。
  • 感谢您的建议。我刚做了。
  • @crstnbr 展示了(暂时丑陋的)方式。

标签: python julia python-import music21


【解决方案1】:

我没有安装包(我会在稍后测试它),但以下应该可以工作:

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

请注意,在我的Pull request 合并后,可以说丑陋(但系统)的[:fieldname] 访问将很快在 Julia 1.0 中消失。这种语法的原因是 Julia 不允许覆盖 . 访问功能。幸运的是,这在 Julia 1.0 中有所改变。

【讨论】:

  • 我只安装了music21,但这对我有用music21.converter[:parse]("tinynotation: 3/4 c4 d8 f g16 a g f#")[:show]("text")
  • 非常感谢!我只是独立得出了代码解决方案,但是您添加的上下文非常有用且有趣。一旦你的拉取请求被合并,我很高兴不必包含那些 [:]。
  • 好吧,我猜我安装包的速度太慢了:)
  • 嘿@crstnbr,你知道我是否可以在不重新编译 Julia 的情况下实现你的拉取请求?如果没有,是否有资源指向使用您的贡献重新编译 Julia 的直接方法(我是新来的那种东西)。我使用 PyCall 的次数越多,您的贡献似乎可以节省大量时间。
  • 你不需要重新编译 Julia,因为这只是一个 PyCall 问题,它是一个外部包。您可以下载我的 fork 包并使用 PR 的分支进行尝试。但是,我认为您真的不应该这样做,而是等待 PR 合并,因为实现尚未完成并且可能包含错误。