it-swarm.com.de

Python: Was sind die nächsten Linux- und OSX-Entsprechungen von winsound.Beep?

Wenn man unter Windows den Lautsprecher piepen möchte, bietet Python 2 anscheinend eine nützliche Funktion: winsound.Beep(). Das Schöne an dieser Funktion ist, dass sie Argumente benötigt, die die genaue Häufigkeit und Dauer des Pieptons angeben. Das ist genau das, was ich tun möchte, außer dass ich kein Windows benutze. So...

Was sind die nächsten Entsprechungen von winsound.Beep() für Linux und OSX, die so wenig Abhängigkeiten wie möglich aufweisen?

Bitte beachten Sie, dass ich in der Lage sein möchte, den Lautsprecher direkt zu piepen und keine Audiodatei abzuspielen. Außerdem muss ich in der Lage sein, die Häufigkeit und Dauer des Pieptons zu steuern, damit curses.beep() und print '\a' nicht funktionieren. Schließlich ist mir bewusst, dass PyGame umfangreiche Soundfunktionen bietet, aber da ich keine der anderen Funktionen von PyGame benötige, scheint es, als würde man mit einem Vorschlaghammer eine Nuss knacken (und trotzdem versuche ich, Abhängigkeiten zu beseitigen so weit wie möglich).

24

Ich habe hier eine mögliche Lösung gefunden: http://bytes.com/topic/python/answers/25217-beeping-under-linux

Dabei wird direkt in/dev/audio geschrieben. Nicht sicher, wie portabel es ist oder ob es überhaupt funktioniert - ich bin nicht auf einem Linux-Rechner atm.

def beep(frequency, amplitude, duration):
    sample = 8000
    half_period = int(sample/frequency/2)
    beep = chr(amplitude)*half_period+chr(0)*half_period
    beep *= int(duration*frequency)
    audio = file('/dev/audio', 'wb')
    audio.write(beep)
    audio.close()
10
Shawabawa

winsound ist nur für Windows und ich konnte keinen anderen plattformübergreifenden Weg finden, als "/ a" zu drucken. Die Häufigkeit und Dauer können Sie hiermit jedoch nicht einstellen.

Sie können jedoch versuchen, mit dem Befehl os.system dasselbe mit dem Systembefehl beep zu tun. Hier ist ein Ausschnitt, der die Funktion playound auf plattformunabhängige Weise definiert

try:
    import winsound
except ImportError:
    import os
    def playsound(frequency,duration):
        #apt-get install beep
        os.system('beep -f %s -l %s' % (frequency,duration))
else:
    def playsound(frequency,duration):
        winsound.Beep(frequency,duration)

Weitere Informationen finden Sie in diesem Blog

BEARBEITEN: Sie müssen das Beep-Paket unter Linux installieren, um den Beep-Befehl auszuführen. Sie können installieren, indem Sie den Befehl eingeben

Sudo apt-get install beep
10
Max Jindal

Die leichteste Cross-Platform-Schicht, die ich sehen kann, ist "PortAudio". Dies wird von R beispielsweise in seinem Paket verwendet, um plattformspezifische Treiberaufrufe in ein einfaches Abspielen/Aufzeichnen von digitalisierten Wellenformen als Array zu verpacken. Die guten Leute bei M.I.T. Erstellen Sie hierfür eine Python-Bindung, aber Sie müssen die kompilierte DLL/SO einbinden, damit dies funktioniert. http://people.csail.mit.edu/hubert/pyaudio/

(libao ist von Xiph, den Machern von Ogg/Vorbis, ähnlich, ein Wrapper-Pyao existiert, aber dies scheint weniger verbreitet zu sein.)

SoX ist ein hervorragender Satz plattformübergreifender Tools mit viel mehr Funktionen für die Formatkonvertierung und das Lesen von Dateien usw.

Die Verwendung von ctypes, um Anrufe von Python an einen Treiber zu tätigen, ist machbar, aber sehr unübersichtlich, selbst wenn es sich um das einfachste ältere WinMM handelt.

2
jayprich

Ich habe 3 Methoden für Linux gefunden:

  • neue Methode unter Verwendung der Linux-API evdev, funktioniert mit jedem Benutzer in der Gruppe input ( Beispielquellcode )
  • alte Methode mit fcntl und /dev/console (erfordert Root-Rechte) ( Beispiel-Quellcode )
  • rufen Sie den Befehl beep direkt mit subprocess oder os.system auf (langsamer und muss im System installiert sein).

Siehe auch my tone () funktioniert hier mit allen Alternativen .

0
eadmaster