2015-06-12 2 views
3

Итак, я последовал this question для того, чтобы получить какой-то звук, играя с Music21, а вот код:Music21 Midi Error: type object '_io.StringIO' не имеет атрибута 'StringIO'. Как это исправить?

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 Distribution) в Windows 7 x64. Я не имею ни малейшего представления о том, как это исправить (но, вероятно, какая-то неясная Python 2.x на Python 3.x вопрос несовместимости, как всегда)

EDIT:

Я редактировал импорт, как предложил в ответ, и теперь я получил TypeError:

enter image description here

что бы вы рекомендуете мне делать в качестве альтернативы «играть какой-то звук» с Music21? (Fluidsynth или что-то еще).

ответ

4

Вы можете быть правы ... Я думаю ошибка может быть на самом деле в 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 

И посмотреть, если это исправляет его.

+0

Большое спасибо SIHA. Ваше предложение сработало, но после этого у меня появился TypeError (я отредактировал вопрос и включил скриншот). –

+1

Хм. Не уверен, извините. [This] (http://stackoverflow.com/questions/11914472/stringio-in-python3) вопрос упоминает вещь String/Byte w.r.t. Python2/3, хотя. Для меня это похоже, что это не было правильно проверено с Python3. – SiHa

+0

Да, это именно то, что я думаю. –

0

возвращение stringIOModule.StringIO (streamMidiWritten) AttributeError: тип объекта '_io.StringIO' не имеет атрибута 'StringIO' Нажмите любую клавишу для продолжения. , ,

Пожалуйста, @Ericsson, просто удалите StringIO из возвращаемого значения, и вы хорошо пойдете.

Теперь будет: возвращение stringIOModule (streamMidiWritten)