Fehlermeldung: Traceback (most recent call last)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hallo, guten Tag.

Was bedeutet bitte die Fehlermeldung oben?
Dann die 2. Meldung : module object has no attribute open

Ich wollte ein Aufnahme starten.

Wie kann man bitte die Attribute von "wave" auflisten?

Danke.
Gruss

Code: Alles auswählen

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte poste die tatsaechliche Fehlermeldung im Gesamten. Und die Fehlermeldung bedeutet nichts, denn most recent call last steht unter JEDER Exception, es ist eine Anleitung, wie man Stacktraces zu lesen hat.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Du hast 227 Posts in einem Python-Forum und weißt nicht, dass der "Traceback" in Python immer mit der Zeile "Traceback (most recent call last)" beginnt?

Die eigentliche Fehlermeldung ist doch sehr offensichtlich (und dir wird sogar gesagt in welcher Zeile sie auftritt): Du versuchst die Funktion "open" von einem Objekt von Typ object aufzurufen. Und die gibt es nicht.
Wenn du wissen willst, welche Funktionen ein Objekt hat, dann schaut man entweder in die Dokumentation oder benutzt die Funktion help() im interaktiven Interpreter.

Code: Alles auswählen

z = "Eine Zeichenkette"
help(z)
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Danke für die Info.

Habe den Fehler behoben , zufällig.
Ich habe hinter der letzten Zeile noch ein Return eingegeben.

PS : mit 71 Jahren vergisst man etwas.

Gruss
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Die Aufnahme funktioniert vom CPC6128.

Danke.
Gruss
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@funkheld: Anmerkungen zum Code: `p` und `wf` sind keine guten Namen. `i` wird nicht verwendet, man braucht aber aus syntaktischen Gründen dort einen Namen: Für solche Namen hat sich die Konvention `_` zu verwenden etabliert.

Wenn Ressourcen wieder freigegeben/geschlossen werden müssen, dann sollte man das im Code auch sicherstellen. Also dass das nicht nur passiert wenn der Programmablauf ganz normal bis zu der Stelle kommt, sondern auch wenn er aus irgendwelche Gründen (``return``, ``break``, Ausnahme) vorher ”abbiegt”.

Im allgemeinen Fall geht das mit einem ``try``/``finally`` wo die Aufräumarbeiten im ``finally``-Block stehen. Da das ein übliches Problem ist, gibt es ``with`` und Objekte die das Kontextmanager-Protokoll implementieren. Zum Beispiel Dateien und auch die Datentypen die `wave.open()` zurück gibt.

Und dann gibt es noch den Fall, dass ein Datentyp zwar kein Kontextmanager ist, wie `pyaudio.Stream`, aber eine `close()`-Methode besitzen, wodurch man `contextlib.closing()` verwenden kann, um daraus einen Kontextmanager zu machen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from contextlib import closing
import wave

import pyaudio

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"


def main():
    port_audio = pyaudio.PyAudio()
    try:
        with closing(
            port_audio.open(
                format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK,
            )
        ) as stream:
            print("* recording")
            frames = [
                stream.read(CHUNK)
                for _ in range(int(RATE / CHUNK * RECORD_SECONDS))
            ]
            print("* done recording")

            stream.stop_stream()
    finally:
        port_audio.terminate()

    with wave.open(WAVE_OUTPUT_FILENAME, "wb") as wave_writer:
        wave_writer.setnchannels(CHANNELS)
        wave_writer.setsampwidth(port_audio.get_sample_size(FORMAT))
        wave_writer.setframerate(RATE)
        wave_writer.writeframes(b"".join(frames))


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten