Music21 Midi Error: type object '_io.StringIO' has no attribute 'StringIO'. How to fix it?
Music21 Midi Error: type object '_io.StringIO' has no attribute 'StringIO'. How to fix it?
所以,我关注了 this question in order to get some sound playing with Music21,这里是代码:
from music21 import *
import random
def main():
# Set up a detuned piano
# (where each key has a random
# but consistent detuning from 30 cents flat to sharp)
# and play a Bach Chorale on it in real time.
keyDetune = []
for i in range(0, 127):
keyDetune.append(random.randint(-30, 30))
b = corpus.parse('bach/bwv66.6')
for n in b.flat.notes:
n.microtone = keyDetune[n.midi]
sp = midi.realtime.StreamPlayer(b)
sp.play()
return 0
if __name__ == '__main__':
main()
这是追溯:
Traceback (most recent call last):
File "main.py", line 49, in <module>
main()
File "main.py", line 44, in main
sp.play()
File "G:\Development\Python Development\Anaconda3\lib\site-packages\music21\mi
di\realtime.py", line 104, in play
streamStringIOFile = self.getStringIOFile()
File "G:\Development\Python Development\Anaconda3\lib\site-packages\music21\mi
di\realtime.py", line 110, in getStringIOFile
return stringIOModule.StringIO(streamMidiWritten)
AttributeError: type object '_io.StringIO' has no attribute 'StringIO'
Press any key to continue . . .
我是 运行 Python 3.4 x86(Anaconda 发行版)Windows 7 x64。我不知道如何解决这个问题(但可能是一些晦涩难懂的 Python 2.x 到 Python 3.x 不兼容问题,一如既往)
编辑:
我已经按照答案中的建议编辑了导入,现在我得到了一个类型错误:
作为 "play some audio" 使用 Music21 的替代方法,您会推荐我做什么? (Fluidsynth 或其他任何东西)。
你可能是对的...我 认为 错误实际上可能在 Music21 中,它处理导入的方式 StringIO
Python 2 有 StringIO.StringIO
,而
Python 3 有 io.StringIO
..但是如果你查看 music21\midi\realtime.py
中的导入语句
try:
import cStringIO as stringIOModule
except ImportError:
try:
import StringIO as stringIOModule
except ImportError:
from io import StringIO as stringIOModule
最后一行是导入 io.StringIO
,所以稍后对 stringIOModule.StringIO()
的调用失败了,因为它实际上是在调用 io.StringIO.StringIO
.
我会尝试将导入语句编辑为:
except ImportError:
import io as stringIOModule
看看是否能解决问题。
return stringIOModule.StringIO(streamMidiWritten)
AttributeError: 类型对象 '_io.StringIO' 没有属性 'StringIO'
按任意键继续 。 . .
请@Ericsson,只需从 return 值中删除 StringIO 即可。
现在将是:
return stringIOModule(streamMidiWritten)
所以,我关注了 this question in order to get some sound playing with Music21,这里是代码:
from music21 import *
import random
def main():
# Set up a detuned piano
# (where each key has a random
# but consistent detuning from 30 cents flat to sharp)
# and play a Bach Chorale on it in real time.
keyDetune = []
for i in range(0, 127):
keyDetune.append(random.randint(-30, 30))
b = corpus.parse('bach/bwv66.6')
for n in b.flat.notes:
n.microtone = keyDetune[n.midi]
sp = midi.realtime.StreamPlayer(b)
sp.play()
return 0
if __name__ == '__main__':
main()
这是追溯:
Traceback (most recent call last):
File "main.py", line 49, in <module>
main()
File "main.py", line 44, in main
sp.play()
File "G:\Development\Python Development\Anaconda3\lib\site-packages\music21\mi
di\realtime.py", line 104, in play
streamStringIOFile = self.getStringIOFile()
File "G:\Development\Python Development\Anaconda3\lib\site-packages\music21\mi
di\realtime.py", line 110, in getStringIOFile
return stringIOModule.StringIO(streamMidiWritten)
AttributeError: type object '_io.StringIO' has no attribute 'StringIO'
Press any key to continue . . .
我是 运行 Python 3.4 x86(Anaconda 发行版)Windows 7 x64。我不知道如何解决这个问题(但可能是一些晦涩难懂的 Python 2.x 到 Python 3.x 不兼容问题,一如既往)
编辑:
我已经按照答案中的建议编辑了导入,现在我得到了一个类型错误:
作为 "play some audio" 使用 Music21 的替代方法,您会推荐我做什么? (Fluidsynth 或其他任何东西)。
你可能是对的...我 认为 错误实际上可能在 Music21 中,它处理导入的方式 StringIO
Python 2 有 StringIO.StringIO
,而
Python 3 有 io.StringIO
..但是如果你查看 music21\midi\realtime.py
try:
import cStringIO as stringIOModule
except ImportError:
try:
import StringIO as stringIOModule
except ImportError:
from io import StringIO as stringIOModule
最后一行是导入 io.StringIO
,所以稍后对 stringIOModule.StringIO()
的调用失败了,因为它实际上是在调用 io.StringIO.StringIO
.
我会尝试将导入语句编辑为:
except ImportError:
import io as stringIOModule
看看是否能解决问题。
return stringIOModule.StringIO(streamMidiWritten) AttributeError: 类型对象 '_io.StringIO' 没有属性 'StringIO' 按任意键继续 。 . .
请@Ericsson,只需从 return 值中删除 StringIO 即可。
现在将是: return stringIOModule(streamMidiWritten)