Mostrando las entradas con la etiqueta linux. Mostrar todas las entradas
Mostrando las entradas con la etiqueta linux. Mostrar todas las entradas

lunes, febrero 14, 2011

iterar por directorios con espacios en un shell script

la vida nos sonríe, nos sentimos cual neo escribiendo comandos en el shell a diestra y siniestra, estamos a punto de para las balas con las manos, corremos:

for i in $(ls); do echo $i; done

y nuestra ilusión hacker se nos cae a pedazos al ver que cada palabra de un directorio o archivo con espacios sale en una linea nueva.

no desesperaos (?) he aquí la solución.

reproduzcamos el error para después arreglarlo:

$ mkdir -p "t/folder 1" "t/folder 2" "t/folder 3 with more spaces"
$ cd t
$ for i in $(ls); do echo $i; done
folder
1
folder
2
folder
3
with
more
spaces



vamos de nuevo ahora con la solución:

$ IFS="$(echo -e "\n\r")"
$ for i in $(ls); do echo $i; done
folder 1
folder 2
folder 3 with more spaces

y todos felices (incluso carlin calvo que puede seguir hackeando literalmente a dos manos en sus computadoras auspiciadas por fravega)

sábado, abril 04, 2009

Reproducir audio en python multiplataforma

una receta de como reproducir un archivo de audio con python en linux, mac y windows.

si encuentran un bug, por favor avisen en los comentarios, solo lo probe en linux :)


import os

def is_on_path(fname):
"""
returns True if fname is the name of an executable on path (*nix only)
"""
for p in os.environ['PATH'].split(os.pathsep):
if os.path.isfile(os.path.join(p, fname)):
return True

return False

def dummy_play(path):
"""
dummy method used when no method is available
"""
print "can't play", path

if os.name == 'nt':
import winsound

def play(path):
winsound.PlaySound(path, winsound.SND_FILENAME)
elif os.name == 'posix':
try:
import gst

def play(path):
"""
play a sound using gstreamer api
"""
_player = gst.element_factory_make("playbin", "player")
uri = "file://" + os.path.abspath(path)
_player.set_property('uri', uri)
_player.set_state(gst.STATE_PLAYING)
except ImportError:
if is_on_path('play'):
play = lambda path: os.popen4('play ' + path)
elif is_on_path('aplay'):
play = lambda path: os.popen4('aplay ' + path)
else:
play = dummy_play
elif os.name == 'mac':
from AppKit import NSSound
def play(path):
"""
play a sound using mac api
"""
macsound = NSSound.alloc()
macsound.initWithContentsOfFile_byReference_(soundPath, True)
macsound.play()
else:
play = dummy_play


para usarlo

import play_sound
play_sound.play('path/al/archivo.wav')

para el caso de gstreamer en linux y el de mac, hace falta un mainloop o algo que mantenga la aplicacion abierta para que reproduzca, con popen no hace falta, en windows no se si bloquea o no.

Seguidores

Archivo del Blog