![](/img/trans.png)
[英]AttributeError: '_io.StringIO' object has no attribute 'StringIO'
[英]Music21 Midi Error: type object '_io.StringIO' has no attribute 'StringIO'. How to fix it?
所以,我已經按照這個問題來播放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 . . .
我在Windows 7 x64上運行Python 3.4 x86(Anaconda Distribution)。 我不知道如何解決這個問題(但可能是一些模糊的Python 2.x到Python 3.x不兼容問題, 一如既往 )
編輯:
我按照答案中的建議編輯了導入,現在我得到了一個TypeError:
你建議我做什么作為Music21的“播放音頻”的替代方案? (Fluidsynth或其他任何東西)。
你可能是對的......我認為錯誤可能實際上在Music21中,它處理StringIO
Python 2有StringIO.StringIO
,而
Python 3有io.StringIO
music21\\midi\\realtime.py
但是如果你看一下music21\\midi\\realtime.py
中的import語句
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
。
我會嘗試將import語句編輯為:
except ImportError:
import io as stringIOModule
並看看是否修復它。
return stringIOModule.StringIO(streamMidiWritten)AttributeError:type object'_io.StringIO'沒有屬性'StringIO'按任意鍵繼續。 。 。
請@Ericsson,只需從返回值中刪除StringIO,就可以了。
它現在將是:return stringIOModule(streamMidiWritten)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.