Python: emette un segnale acustico


97

Sto cercando di farmi emettere un segnale acustico dal programma. Sono su una macchina Windows. Ho guardato http://docs.python.org/library/winsound.html

Ma non sono sicuro di come programmarlo con uno scanner di codici a barre.

Ecco il mio codice per lo scanner di codici a barre seriale.

ser = serial.Serial()
ser.baudrate = 9600

#for windows
ser.port = 2 #for COM3

ser.open()
ser.write('hello')
ser.close()

AGGIORNAMENTO: Dato che sto infastidendo i miei colleghi con il segnale acustico. Posso farlo passare attraverso il jack audio per le cuffie?


4
Vuoi che lo scanner di codici a barre faccia rumore o anche la macchina Windows a cui è collegata?
Setheron

la macchina delle finestre. Penso che il lettore di codici a barre lo farà da solo
Marc Brigham,

9
Re "Update": Sì, è risaputo che i bip sono fastidiosi :)
jforberg

C'è qualcosa che funziona per OS X? Non riesco a trovare il modulo winsound.
Charlie Parker

2
@CharlieParker perché il suono di vittoria è per Windows. Stampa invece "\ a".
noɥʇʎԀʎzɐɹƆ

Risposte:


145

Su Windows, se desideri che il computer emetta un segnale acustico:

import winsound
frequency = 2500  # Set Frequency To 2500 Hertz
duration = 1000  # Set Duration To 1000 ms == 1 second
winsound.Beep(frequency, duration)

La winsound.Beep()può essere utilizzato ovunque si desidera che il segnale acustico si verifichi.


12
Questo è pulito:def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
Skurmedel

8
Oppure def sos(): for i in range(0, 3): winsound.Beep(2000, 100) for i in range(0, 3): winsound.Beep(2000, 400) for i in range(0, 3): winsound.Beep(2000, 100). Probabilmente dovrei tornare a lavorare ora: D
Skurmedel

1
Su Windows Winsound.Beep viene trasmesso attraverso Windows Sounds.
Jakob Bowyer,

Sono su Mac, non riesco a trovarlo su pip repo?
Volatil3

interessante, non esiste nel mio ambiente anaconda ... è strano?
Charlie Parker

127

Il modo multipiattaforma per farlo è print '\a' . Questo invierà il carattere ASCII Bell a stdout e, si spera, genererà un segnale acustico (un "avviso"). Si noti che molti emulatori di terminale moderni offrono la possibilità di ignorare i caratteri della campana.

Dato che sei su Windows, sarai felice di sapere che Windows ha la sua API Beep (tieniti forte) , che ti consente di inviare segnali acustici di lunghezza e tono arbitrari. Nota che questa è una soluzione solo per Windows, quindi dovresti probabilmente preferire a print '\a'meno che non ti interessi davvero Hertz e millisecondi.

L'API Beep è accessibile tramite il modulo winsound : http://docs.python.org/library/winsound.html


1
Sebbene abbia chiesto specificatamente per Windows, penso che questa sia la soluzione migliore, a meno che l'API di WinSound non torni a \ a per il sistema operativo indipendente. Ci sono anche molte API audio
Setheron

2
Francamente, eviterei del tutto di riprodurre i segnali acustici degli altoparlanti del PC in un serio sforzo di programmazione. Se è effettivamente su Windows, dovrebbe probabilmente provare a riprodurre il segnale di "avviso" predefinito del tema di sistema. Con un po 'di fortuna, quel segnale è accessibile tramite qualsiasi pacchetto GUI che sta utilizzando.
jforberg

1
Se utilizzi la stampa in un'app della console, considera l'aggiunta di end = "" per evitare una nuova riga ogni volta che emetti un segnale acustico.
Tony

1
@jforberg L'API per questo è winsound.MessageBeep che può accettare MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION e MB_OK.
Peter Wood,

1
Se stai usando Python 3, non dimenticare di usare le parentesi o otterrai un errore di sintassi. Usa print ('\ a')
ZorroDeLaArena

27

Linux.

$ apt-get install beep

$ python
>>> os.system("beep -f 555 -l 460")

O

$ beep -f 659 -l 460 -n -f 784 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 880 -l 230 -n -f 659 -l 230 -n -f 587 -l 230 -n -f 659 -l 460 -n -f 988 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 1047-l 230 -n -f 988 -l 230 -n -f 784 -l 230 -n -f 659 -l 230 -n -f 988 -l 230 -n -f 1318 -l 230 -n -f 659 -l 110 -n -f 587 -l 230 -n -f 587 -l 110 -n -f 494 -l 230 -n -f 740 -l 230 -n -f 659 -l 460

12
Downvoted per due ragioni: primo, GNU / Linux! = Debian e apt-get non sono universali; secondo, non dovresti usare os.system, usa invece il modulo subprocess.
Ben

1
Come utente Linux che cerca di ottenere un segnale acustico semplice ed economico quando termina un codice lungo, questa era di gran lunga la soluzione più semplice. Ho particolarmente adorato il piccolo jingle! Nota che potresti dover chiamare "sudo modprobe pcspkr" e installare beep prima che questa opzione funzioni, secondo askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh

4
os.systemva bene, soprattutto con un valore hardcoded, non tutti scrivono un server web.
cz

errore di battitura -f 1047-l, dovrebbe essere -f 1047 -l, spazio mancante
bartekbrak

@Ben Vecchia domanda, ma fwiw sembra piuttosto difficile dare un voto negativo a questo. La domanda si riferisce a un'area senza soluzione multipiattaforma per come la intendo io. La risposta accettata con 140 Mi piace è specifica di Windows. E non spieghi perché un modulo legittimo sia una "cattiva" pratica.
geoteoria

17

Stavo cercando lo stesso ma per la shell di Linux.

L'argomento mi ha portato a una risposta, -grazie-

Forse modo più pitonico:

import os
beep = lambda x: os.system("echo -n '\a';sleep 0.2;" * x)
beep(3)

Appunti :

  • il valore del sonno (qui 0,2), dipende dalla durata (secondi) del segnale acustico predefinito
  • Ho scelto di usare os.systempiuttosto allorasubprocess.Popen per semplicità (potrebbe essere un male)
  • il '-n' per echo non deve più essere visualizzato
  • l'ultimo ';' doposleep è necessario per la sequenza di testo risultante (* x)
  • testato anche tramite ssh su un termine X.

3
Python ha un equivalente sia echo( print) che sleep, quindi in realtà non è pythonic passare attraverso chiamate esterne, specialmente quando sono chiamate Unix (non portatili).
Eric O Lebigot

cosa significa (3)?
bumbumpaw

9

C'è una risposta di Windows e una risposta Debian, quindi eccone una per Mac :

Ciò presuppone che tu sia qui alla ricerca di un modo rapido per creare un suono di avviso personalizzabile, e non specificamente il segnale acustico piezeoelettrico che ricevi su Windows:

os.system( "say beep" )

Dichiarazione di non responsabilità: puoi sostituire os.systemcon una chiamata al subprocessmodulo se sei preoccupato che qualcuno possa hackerare il tuo codice acustico.

Vedere: Come emettere il segnale acustico dell'hardware in Mac OS X 10.6


6

Il modo multipiattaforma:

import time
import sys
for i in range(1,6):
    sys.stdout.write('\r\a{i}'.format(i=i))
    sys.stdout.flush()
    time.sleep(1)
sys.stdout.write('\n')

5
L'unica parte importante di questo èsys.stdout.write('\a')
jstrieb

1
@jstrieb - questo è un piccolo programma autonomo. La sua importanza nella completezza stessa.
FooBar167

4

Ho fatto un pacco per questo scopo.

Puoi usarlo in questo modo:

from pybeep.pybeep import PyVibrate, PyBeep
PyVibrate().beep()
PyVibrate().beepn(3)
PyBeep().beep()
PyBeep().beepn(3)

Dipende da sox e supporta solo python3.


1
Prova pip3 install pybeep.
qed

1
Sappi solo che devi installare sox. run: brew install sox
Jam M. Hernandez Q.28

3

Utilizzo pygamesu qualsiasi piattaforma

Il vantaggio dell'utilizzo pygameè che può essere fatto funzionare su qualsiasi piattaforma del sistema operativo. Tuttavia, il codice di esempio sotto è per GNU / Linux .

Prima installa il pygamemodulo per python3come spiegato in dettaglio qui .

$ sudo pip3 install pygame

Il pygamemodulo può riprodurre file .wave .oggda qualsiasi posizione di file. Ecco un esempio:

#!/usr/bin/env python3
import pygame
pygame.mixer.init()
sound = pygame.mixer.Sound('/usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga')
sound.play()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.