Seite 1 von 1
Fehlermeldung: Traceback (most recent call last)
Verfasst: Sonntag 18. August 2019, 15:03
von funkheld
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()
Re: Fehlermeldung: Traceback (most recent call last)
Verfasst: Sonntag 18. August 2019, 15:12
von __deets__
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.
Re: Fehlermeldung: Traceback (most recent call last)
Verfasst: Sonntag 18. August 2019, 15:14
von sparrow
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.
Re: Fehlermeldung: Traceback (most recent call last)
Verfasst: Sonntag 18. August 2019, 15:24
von funkheld
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
Re: Fehlermeldung: Traceback (most recent call last)
Verfasst: Sonntag 18. August 2019, 15:49
von funkheld
Die Aufnahme funktioniert vom CPC6128.
Danke.
Gruss
Re: Fehlermeldung: Traceback (most recent call last)
Verfasst: Sonntag 18. August 2019, 17:09
von __blackjack__
@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()