Python: издает звуковой сигнал

104

Я пытаюсь заставить программу издавать звуковой сигнал. Я на Windows-машине. Я посмотрел http://docs.python.org/library/winsound.html

Но не знаю, как запрограммировать это с помощью сканера штрих-кода.

Вот мой код для серийного сканера штрих-кода.

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

#for windows
ser.port = 2 #for COM3

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

ОБНОВЛЕНИЕ: так как я раздражаю своих коллег звуковым сигналом. Можно ли заставить его выходить через аудиоразъем для наушников?

Марк Бригам
источник
4
Вы хотите, чтобы сканер штрих-кода издавал шум или компьютер с Windows, к которому он подключен?
Сетерон
машина windows. Я думаю, что сканер штрих-кода сделает это сам,
Марк Бригам
11
Re "Update": Да, это общеизвестный факт, что гудки раздражают :)
jforberg
2
@CharlieParker, потому что звук для Windows. Вместо этого выведите "\ a".
noɥʇʎԀʎzɐɹƆ

Ответы:

158

В Windows, если вы хотите, чтобы компьютер просто издал звуковой сигнал:

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

winsound.Beep()Может использоваться везде , где вы хотите , чтобы произойти звуковой сигнал.

CyanRook
источник
13
Этот def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
замечательный
9
Или 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). Я, наверное, должен вернуться к работе сейчас: D
Скурмедель
1
На windows winsound. Звук разносится по окнам.
Jakob Bowyer
Я на Mac, не могу найти это в репозитории pip?
Volatil3
интересно, его нет в моей среде анаконды ... это странно?
Чарли Паркер
131

Кросс-платформенный способ сделать это - print('\a'). Это отправит символ ASCII Bell на стандартный вывод и, надеюсь, сгенерирует звуковой сигнал (для «предупреждения»). Обратите внимание, что многие современные эмуляторы терминала позволяют игнорировать символы звонка.

Поскольку вы работаете в Windows, вы будете счастливы услышать, что в Windows есть собственный (приготовьтесь) Beep API , который позволяет отправлять гудки произвольной длины и высоты. Обратите внимание, что это решение только для Windows, поэтому вам, вероятно, следует предпочестьprint('\a') если вы действительно не заботитесь о Герцах и миллисекундах.

Доступ к Beep API осуществляется через модуль winsound : http://docs.python.org/library/winsound.html

Jforberg
источник
1
Хотя он спросил конкретно о Windows, я думаю, что это лучшее решение, если только WinSound API не вернется к \ a для независимой от ОС. Также существует множество аудио API
Сетерон
2
Честно говоря, я бы вообще отказался от воспроизведения звуковых сигналов в динамиках ПК при серьезном программировании. Если он действительно работает в Windows, ему, вероятно, следует вместо этого попытаться воспроизвести сигнал предупреждения системной темы по умолчанию. Если повезет, этот сигнал будет доступен через любой графический интерфейс, который он использует.
jforberg
1
Если вы используете печать в консольном приложении, подумайте о добавлении end = "", чтобы не вводить новую строку каждый раз, когда вы подаете звуковой сигнал.
Тони
2
@jforberg API для этого - winsound.MessageBeep, который может принимать MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION и MB_OK.
Питер Вуд
2
Если вы используете Python 3, не забудьте использовать круглые скобки, иначе вы получите синтаксическую ошибку. Используйте print ('\ a')
ZorroDeLaArena
28

Linux.

$ apt-get install beep

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

ИЛИ

$ 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
Проголосовали против по двум причинам: во-первых, GNU / Linux! = Debian и apt-get не универсальны; во-вторых, вы не должны использовать os.system, вместо этого используйте модуль subprocess.
Бен
1
Как пользователь Linux, пытающийся получить простой и дешевый звуковой сигнал при завершении длинного кода, это было, безусловно, самым простым решением. Мне особенно понравился этот маленький джингл! Обратите внимание, что вам, возможно, придется вызвать «sudo modprobe pcspkr» и установить звуковой сигнал, прежде чем эта опция заработает, согласно askubuntu.com/questions/19906/beep-in-shell-script-not-working
Джон
6
os.systemэто нормально, особенно с жестко заданным значением, не все пишут веб-сервер.
cz
опечатка -f 1047-l, должно быть -f 1047 -l, пробел отсутствует
bartekbrak
@Ben Старый вопрос, но, кажется, довольно сурово отрицать это. Вопрос касается области, в которой нет кроссплатформенного решения, насколько я понимаю. Принятый ответ со 140 лайками относится к Windows. И вы не объясняете, почему законный модуль - это «плохая» практика.
geotheory
17

Я искал то же самое, но для оболочки Linux.

Тема привела меня к ответу, -спасибо-

Может быть, более питоническим образом:

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

Примечания :

  • значение сна (здесь 0,2) зависит от продолжительности (в секундах) вашего звукового сигнала по умолчанию
  • Я решил использовать, os.systemа не subprocess.Popenдля простоты (это могло быть плохо)
  • '-n' echoозначает, что больше не отображается
  • последний ';' after sleepнеобходимо для результирующей текстовой последовательности (* x)
  • также тестировался через ssh на терминале X
s4mdf0o1
источник
3
Python имеет эквивалент both echo( print) и sleep, поэтому на самом деле это не pythonic для выполнения внешних вызовов, особенно когда они (непереносимые) вызовы Unix.
Эрик О Лебигот
что означает (3)?
bumbumpaw
11

Есть ответ Windows и ответ Debian, так что вот ответ Mac :

Это предполагает, что вы просто ищете быстрый способ сделать настраиваемый звуковой сигнал, а не пьезоэлектрический сигнал, который вы получаете в Windows:

os.system( "say beep" )

Отказ от ответственности: вы можете заменить os.systemвызовом subprocessмодуль, если беспокоитесь о том, что кто-то взломает ваш звуковой код.

См .: Как сделать звуковой сигнал оборудования в Mac OS X 10.6

cz
источник
7

Кроссплатформенный способ:

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')
FooBar167
источник
5
Единственная важная часть этогоsys.stdout.write('\a')
jstrieb
2
@jstrieb - это крошечная отдельная программа. Его важность в самой полноте.
FooBar167
1
Это должен быть главный ответ
Два
3

Я сделал для этого пакет .

Вы можете использовать это так:

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

Это зависит от sox и поддерживает только python3.

qed
источник
1
Попробуйте pip3 установить pybeep.
Qed 05
1
Просто знайте, что вам нужно установить sox. run: brew install sox
Jam M. Hernandez Q.
не работает в Windows Py 3.8
Джейми Изадди Радд,
3

Использование pygameна любой платформе

Преимущество использования в pygameтом, что его можно заставить работать на любой платформе ОС. Однако ниже пример кода предназначен для GNU / Linux .

Сначала установите pygameмодуль, python3как подробно описано здесь .

$ sudo pip3 install pygame

pygameМодуль может воспроизводить .wavи .oggфайлы из любого расположения файла. Вот пример:

#!/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

В Linux: print('\007') будет звучать системный звонок.

Родриго
источник