Wait for a system command executed in the background

Brice mealier_brice at NO_SPAM_yahoo.fr
Sun Nov 5 18:32:39 CET 2006


Hello


I am new to python and I am really a bad programmer...

As a linux user, I use quodlibet for listening to music. Quodlibet
allows me to write plugins in python.

I am trying to write a plugins to burn a playlist by using cdrecord, and
this either in dao or tao mode.

The basic of this plugin is the following:

- make a temp directory
- convert the songs in my playlist into wave files in the temp directory
  using mplayer and renaming them with 3 digits number so that the order
of my playlist is conserved
- normalize the wave files
- burn the cd
- delete the temp directory.


At the time, I have a working solution (not fully developped by
myself...), but in this solution os.system is used to start the
different shell commands and the commands do not have a & at the end.
Therefore during the whole execution of the plugin, quodlibet is not
responsive.

What I would like to is program the whole such that I can use & at the
end of the shell commands and each command to be executed one after the
other! (I tried to put & simply at the end of each shell command with
the result that each where started at the same time)

Here is the plugin:

###########################################################################


import os, string, re
import util
import sys
import shutil
from qltk import ErrorMessage
from shutil import copy
from plugins.songsmenu import SongsMenuPlugin

class _Base(SongsMenuPlugin):
     PLUGIN_ICON = 'gtk-cdrom'
     PLUGIN_VERSION = '0.1'

     # XXX : pb potentiel: si deux utilisateurs utilisent ce plugin
     # en meme temps, ils vont se marcher sur les pieds...
     destdir = "/tmp/cd_QL"

     convert_cmd = "mplayer -ao pcm:file=%(dest)s %(source)s"
     normalize_cmd = "normalize -m %(path)s/*.wav"
     burn_cmd = "cdrecord -v -eject %(flags)s -pad -audio
%(path)s/*.wav"
     burn_flags = ''

     def plugin_songs(self, songs):
         if not self.check_mplayer():
             return

         self.setup()
         try:
             try:
                 for num, song in enumerate(songs):
                     self.makewav(song, num)
                 self.normalize()
                 self.burn()
             except Exception, e:
                 ErrorMessage(
                     None,
                     "Unknown error",
                     "An error occured while processing files:\n%s." % e
                     ).run()
         finally:
             self.teardown()

     def check_mplayer(self):
         if not util.iscommand("mplayer"):
             ErrorMessage(
                 None,
                 "Mplayer not found",
                 "Mplayer is used to convert files in wave files."
                 ).run()
             return False
         return True

     def setup(self):
         os.mkdir(self.destdir)

     def makewav(self, song, num):
         source = song['~filename'].replace(" ", "\
").replace("'","\\'")
         dest = os.path.join(self.destdir, "%03d.wav" % num)
         cmd = self.convert_cmd % dict(source=source, dest=dest)
         os.system(cmd)

     def normalize(self):
         os.system(self.normalize_cmd % dict(path=self.destdir))

     def burn(self):
         flags = self.burn_flags
         cmd = self.burn_cmd % dict(path=self.destdir, flags=flags)
         os.system(cmd)

     def teardown(self):
         shutil.rmtree(self.destdir)


class DAO(_Base):
     PLUGIN_ID = 'Burn CD w/o blanks'
     PLUGIN_NAME = _('Burn CD w/o blanks')
     PLUGIN_DESC = 'Burn CD w/o blanks.'
     burn_flags = '-dao'


class TAO(_Base):
     PLUGIN_ID = 'Burn CD with blanks'
     PLUGIN_NAME = _('Burn CD with blanks')
     PLUGIN_DESC = 'Burn CD with blanks.'

# on exporte seulement ces deux classes
__all__ = ['DAO', 'TAO']



#############################################################################



and yeah, please consider that I am new to python and do understand
something to the thread!


Thanks in advance

-- 
Brice
Arch Linux (Linux user nb. 372699)
-----
"Unix IS user friendly, it is just selective about who his friends are"



More information about the Python-list mailing list