AttributeError:Wave_write实例没有属性' __ exit __'

时间:2017-10-03 07:03:56

标签: python with-statement

在处理我的教授给我的一些代码用于作业时,我无法改变每条指令。我一直在环顾四周,并在初始写入时添加了关闭,但有没有阻止修改入门代码?

代码来自:

致电代码:

def run_menu():

    global CURRENT_TIME

    # Provide a minimal indication that the program has started.
    print(MINIMAL_HELP_STRING)

    # Get the first keystroke.
    c = readchar.readchar()

    # Endless loop responding to the user's last keystroke.
    # The loop breaks when the user hits the QUIT_MENU_KEY.
    while True:

        # Respond to the user's input.
        if c == FORWARD_KEY:

            # Advance the time, looping back around to the start.
            CURRENT_TIME += 1
            if CURRENT_TIME == len(NUMBERS_WAV):
                CURRENT_TIME = 0

            # Concatenate three audio files to generate the message.
            sound.combine_wav_files(TMP_FILE_WAV, YOU_SELECTED_WAV,
                                    NUMBERS_WAV[CURRENT_TIME], AM_WAV)

            # Play the concatenated file.
            sound.Play(TMP_FILE_WAV)

功能代码:

def combine_wav_files(out_file, *files):
    with wave.open(out_file, 'wb') as out:
        with wave.open(files[0], 'rb') as first_in:
            (nchannels, sampwidth, framerate, nframes, comptype, compname) =\
              first_in.getparams()
            out.setparams(first_in.getparams())
        for filename in files:
            with wave.open(filename, 'rb') as cur_in:
                if (cur_in.getnchannels() != nchannels or
                    cur_in.getsampwidth() != sampwidth or
                    cur_in.getframerate() != framerate or
                    cur_in.getcomptype() != comptype or
                    cur_in.getcompname() != compname):
                    raise Exception('Mismatched file parameters: ' + filename)
                out.writeframes(cur_in.readframes(cur_in.getnframes()))

错误讯息:

Exception wave.Error: Error('# channels not specified',) in <bound method Wave_write.__del__ of <wave.Wave_write instance at 0x104029e60>> ignored
Traceback (most recent call last):
    File "sample_menu.py", line 144, in <module>
      main()
    File "sample_menu.py", line 25, in main
      run_menu()
    File "sample_menu.py", line 113, in run_menu
      NUMBERS_WAV[CURRENT_TIME], AM_WAV)
    File "/Users/jaredsmith/Desktop/443/P1 Starter Code 2017/sound.py", line 86, in combine_wav_files
      with wave.open(out_file, 'wb') as out:
AttributeError: Wave_write instance has no attribute '__exit__'

我把修复程序放在导入下,然后就可以了!

修复(更新):

####
# From http://web.mit.edu/jgross/Public/21M.065/sound.py 9-24-2017    
####

def _trivial__enter__(self):
    return self
def _self_close__exit__(self, exc_type, exc_value, traceback):
    self.close()

wave.Wave_read.__exit__ = wave.Wave_write.__exit__ = _self_close__exit__
wave.Wave_read.__enter__ = wave.Wave_write.__enter__ = _trivial__enter__

4 个答案:

答案 0 :(得分:1)

您在Wave_write语句中使用with实例。为了使其正常工作,Wave_write必须是上下文管理器,这意味着它必须实现方法__enter__()__exit__()。这里情况不同。

您必须将__exit__方法添加到Wave_write,或者删除with语句并手动关闭输入(如果需要)。例如:

out = wave.open(out_file, 'wb'):
    [do_stuff]
out.close() # if Wave_write implements a closing method, use it. the with statement and __exit__() method would have handled that for you.

请参阅https://docs.python.org/2/reference/compound_stmts.html#withhttps://docs.python.org/2/library/contextlib.html

答案 1 :(得分:0)

此行中的with关键字

with wave.open(out_file, 'wb') as out

暗示wave.open已被编写为上下文管理器,但它没有。取出with并改为执行此操作:

out = wave.open(out_file, 'wb')

答案 2 :(得分:0)

如果您的教授向您提供了该代码,那么他使用的是python3,其中wave.open()返回的对象可以用作上下文管理器。你似乎在使用python2,但事实并非如此。

您应该使用与教授相同的版本,否则您将始终遇到此类问题。所以你应该切换到python3。

答案 3 :(得分:0)

对我来说,解决方法是在上述线程(AttributeError: Wave_write instance has no attribute '__exit__')中添加 JD Smith 提到的以下代码。 这对我有用。只要在您的import语句下面添加这些代码行,它就会起作用。 确保添加(导入wave语句)

import wave

def _trivial__enter__(self):
    return self
def _self_close__exit__(self, exc_type, exc_value, traceback):
    self.close()

wave.Wave_read.__exit__ = wave.Wave_write.__exit__ = _self_close__exit__
wave.Wave_read.__enter__ = wave.Wave_write.__enter__ = _trivial__enter__