Python: faire un bip sonore


98

J'essaie de faire en sorte que le programme me donne un bip. Je suis sur une machine Windows. J'ai regardé http://docs.python.org/library/winsound.html

Mais je ne sais pas comment je peux programmer cela avec un lecteur de codes-barres.

Voici mon code pour le lecteur de codes à barres série.

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

#for windows
ser.port = 2 #for COM3

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

MISE À JOUR: Depuis que j'ennuie mes collègues avec le bip. Puis-je le faire passer par la prise audio pour casque?


4
Vous voulez que le lecteur de codes barres fasse du bruit ou que la machine Windows soit connectée aussi?
Setheron

la machine à fenêtres. Je pense que le scanner de codes-barres le fera tout seul
Marc Brigham

10
Re "Update": Oui, c'est un fait bien connu que les bips sont ennuyeux :)
jforberg

2
@CharlieParker parce que le son gagnant est pour Windows. Imprimez plutôt "\ a".
noɥʇʎԀʎzɐɹƆ

Réponses:


149

Sous Windows, si vous voulez simplement que l'ordinateur émette un bip:

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

Le winsound.Beep()peut être utilisé partout où vous souhaitez que le bip se produise.


12
Celui-ci est soigné:def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
Skurmedel

9
Ou 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). Je devrais probablement retourner au travail maintenant: D
Skurmedel

1
Sur Windows Winsound.Beep est transporté à travers Windows Sounds.
Jakob Bowyer

Je suis sur Mac, je ne le trouve pas sur pip repo?
Volatil3

intéressant, il n'existe pas dans mon environnement anaconda ... est-ce bizarre?
Charlie Parker

130

La manière multiplateforme de le faire est de print('\a'). Cela enverra le caractère ASCII Bell à stdout, et, espérons-le, générera un bip (un pour «alerte»). Notez que de nombreux émulateurs de terminaux modernes offrent la possibilité d'ignorer les caractères de cloche.

Puisque vous êtes sous Windows, vous serez heureux d'apprendre que Windows a sa propre API Beep (accrochez-vous) , qui vous permet d'envoyer des bips de longueur et de hauteur arbitraires. Notez qu'il s'agit d'une solution Windows uniquement, vous devriez donc probablement préférer à print('\a')moins que vous ne vous souciez vraiment de Hertz et des millisecondes.

L'API Beep est accessible via le module winsound : http://docs.python.org/library/winsound.html


1
Bien qu'il ait demandé spécifiquement Windows, je pense que c'est la meilleure solution, à moins que l'API WinSound ne revienne à \ a pour un système d'exploitation indépendant. Il existe également de nombreuses API audio
Setheron

2
Franchement, j'éviterais de jouer les bips du haut-parleur du PC dans un effort de programmation sérieux. S'il est effectivement sous Windows, il devrait probablement essayer de jouer le signal "d'alerte" par défaut du thème système à la place. Avec un peu de chance, ce signal est accessible via n'importe quel package GUI qu'il utilise.
jforberg

1
Si vous utilisez print dans une application console, pensez à ajouter end = "" pour éviter une nouvelle ligne à chaque bip.
Tony

2
@jforberg L'API pour cela est winsound.MessageBeep qui peut prendre MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION et MB_OK.
Peter Wood

2
Si vous utilisez Python 3, n'oubliez pas d'utiliser des parenthèses ou vous obtiendrez une erreur de syntaxe. Utilisez print ('\ a')
ZorroDeLaArena

27

Linux.

$ apt-get install beep

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

OU

$ 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
Évalué pour deux raisons: premièrement, GNU / Linux! = Debian et apt-get ne sont pas universels; deuxièmement, vous ne devriez pas utiliser os.system, utilisez plutôt le module de sous-processus.
Ben le

1
En tant qu'utilisateur Linux essayant d'obtenir un bip simple et bon marché lorsqu'un code long se termine, c'était de loin la solution la plus simple. J'ai particulièrement aimé le petit jingle! Notez que vous devrez peut-être appeler "sudo modprobe pcspkr" et installer beep avant que cette option ne fonctionne, selon askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh

4
os.systemc'est bien, surtout avec une valeur codée en dur, tout le monde n'écrit pas un serveur Web.
cz

faute de frappe -f 1047-l, devrait être -f 1047 -l, espace manquant
bartekbrak

@Ben Ancienne question, mais pour l'instant, il semble assez difficile de voter contre cela. La question concerne un domaine sans solution multiplateforme telle que je la comprends. La réponse acceptée avec 140 likes est spécifique à Windows. Et vous n'expliquez pas pourquoi un module légitime est une «mauvaise» pratique.
geotheory le

17

Je cherchais le même mais pour le shell Linux.

Le sujet m'a amené à une réponse, -merci-

Peut-être de manière plus pythonique:

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

Remarques :

  • la valeur de sommeil (ici 0,2), dépend de la durée (secondes) de votre bip par défaut
  • J'ai choisi de l'utiliser os.systemplutôt que subprocess.Popenpar simplicité (ça pourrait être mauvais)
  • le '-n' pour echoest de ne plus avoir d'affichage
  • le dernier ';' after sleepest nécessaire pour la séquence de texte résultante (* x)
  • également testé via ssh sur un terme X

3
Python a un équivalent à la fois echo( print) et sleep, donc il n'est en fait pas pythonique de passer par des appels externes, en particulier lorsqu'il s'agit d'appels Unix (non portables).
Eric O Lebigot

que signifie (3)?
bumbumpaw

9

Il y a une réponse Windows et une réponse Debian, alors voici une réponse Mac :

Cela suppose que vous cherchiez ici un moyen rapide de créer un son d'alerte personnalisable, et pas spécifiquement le bip piézoélectrique que vous obtenez sous Windows:

os.system( "say beep" )

Avertissement: Vous pouvez remplacer os.systempar un appel au subprocessmodule si vous craignez que quelqu'un pirate votre code sonore.

Voir: Comment faire retentir le bip matériel sous Mac OS X 10.6


6

La manière multiplateforme:

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
La seule partie importante de ceci estsys.stdout.write('\a')
jstrieb

2
@jstrieb - c'est un petit programme autonome. Son importance dans l'exhaustivité elle-même.
FooBar167

Cela ne fonctionne pas dans le notebook
jupyter

4

J'ai fait un paquet à cet effet.

Vous pouvez l'utiliser comme ceci:

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

Cela dépend de sox et ne prend en charge que python3.


1
Essayez pip3 install pybeep.
qed

1
Sachez simplement que vous devez installer sox. run: brew install sox
Jam M. Hernandez Q.28

3

Utilisation pygamesur n'importe quelle plateforme

L'avantage de l'utilisation pygameest qu'il peut être fait pour fonctionner sur n'importe quelle plate-forme OS. L'exemple de code ci-dessous est cependant pour GNU / Linux .

Installez d'abord le pygamemodule python3comme expliqué en détail ici .

$ sudo pip3 install pygame

Le pygamemodule peut lire .wavet .oggfichiers à partir de n'importe quel emplacement de fichier. Voici un exemple:

#!/usr/bin/env python3
import pygame
pygame.mixer.init()
sound = pygame.mixer.Sound('/usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga')
sound.play()

0

Sous Linux: print('\007') fera sonner la cloche du système.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.