Wait for a system command executed in the background

B

Brice

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
 
D

Dennis Lee Bieber

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.
Might it not be easier to just write each of those commands to a
temporary file, then at the end submit that file as a shell script that
runs in the background? {Maybe the last command should be one the
deletes the file itself?}

--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 
B

Brice

Might it not be easier to just write each of those commands to a
temporary file, then at the end submit that file as a shell script that
runs in the background? {Maybe the last command should be one the
deletes the file itself?}

At the time being I don't see other possible solution. Let's see if
someone else's got an idea.

Thx
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,810
Latest member
Kassie0918

Latest Threads

Top