I'm trying to create an alarm function with Python3. The below code does work but it doesn't seem like this is the most optimal way of achieving something like this. Is there a more pythonic way?
#!/usr/local/bin/python3
import os
import time
def alarm():
os.system('amixer -D pulse sset Master 30%') # >> Set initial volume
for beep in range(0, 20):
time.sleep(.002)
os.system('play --no-show-progress --null --channels 1 synth %s sine %f' % (.08, 2500))
alarm()
2 Answers 2
Pythonic approach
For sound playback in Python, see this discussion.
Avoid
os.system
If you are forced to use it, supply a fully qualified path to the executable. You never know what weird program called
play
may be in the search path prior to an intended one.Modularize
As written, the code is not reusable. An attempt to
import
it would result in an immediate alarm sound. Put the call toalarm
in anif __name__ == '__main__':
clause.
Avoid magic numbers
All the parameters (beep duration, volume, etc) better be passed via a command line (see
sys.argv
andoptparse
module).Dummy variable
is customarily denoted as
_
:for _ in range(20):
This is the old way of formatting strings:
'play --no-show-progress --null --channels 1 synth %s sine %f' % (.08, 2500)
The current Python method is to use str.format
.
'play --no-show-progress --null --channels 1 synth {} sine {}'.format(.08, 2500)
It's not a huge advantage here, though you'll notice it's type agnostic. But it has many advantages available so it's good to get used to using it.