Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[debutant] pbm boucle for

15 réponses
Avatar
Brice
Bonjour

Je suis complètement débutant en python et je rencontre un problème avec
une boucle for et un waitpid. En fait je cherche à programmer un plugin
pour quodlibet (pour ceux qui connaissent sous linux), pour pouvoir
graver une liste de lecture.

Les opérations que je souhaite effectuer sont les suivantes:

-copie des fichiers musicaux dans un répertoire temporaire
-décompression en wav avec mplayer
-normalisation des niveaux sonores
-gravage ave cdrecord


Pour celà j'ai fait la bidouille suivante:


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

class BurnCD(object):
PLUGIN_ID = 'Burn CD'
PLUGIN_NAME = _('Burn CD')
PLUGIN_DESC = 'Burn CD.'
PLUGIN_ICON = 'gtk-cdrom'
PLUGIN_VERSION = '0.1'

def plugin_songs(self, songs):
if not util.iscommand("mplayer"):
ErrorMessage(
None, "Mplayer not found",
"Mplayer is used to convert files in wave files.").run()
else:
os.system("mkdir /tmp/cd_QL")
for song in songs:
copy_dir="/tmp/cd_QL/"
shutil.copy(song['~filename'], copy_dir)
for (root, dirs, files) in os.walk('/tmp/cd_QL'):
for file in files:
os.rename(os.path.join(root,file),os.path.
join(root,file).replace(' ','_'))
p=os.system("mplayer -ao pcm:file=/tmp/cd_QL
/$(ls /tmp/cd_QL|wc -l).wav /tmp/cd_QL/%s &" % file.replace(' ' ,'_'))
p.waitpid()
# os.system("cd /tmp/cd_QL/ && normalize -m *.wav && cdrecord -v
-eject -pad -audio *.wav &")



class DAO(BurnCD, SongsMenuPlugin):
PLUGIN_ID = 'Burn CD w/o blanks'
PLUGIN_NAME = _('Burn CD w/o blanks')

class TAO(BurnCD, SongsMenuPlugin):
PLUGIN_ID = 'Burn CD with blanks'
PLUGIN_NAME = _('Burn CD with blanks')





Le but à terme est aussi de pouvoir graver en dao ou tao.

Mon pbm est le suivant: la boucle "for (root, dirs, files) in
os.walk('/tmp/cd_QL')" ne boucle pas! en effet, seul le premier fichier
de ma liste de lecture est copié et converti en wave... La suppression
des espaces se passe sans problème.

Question subsidiaire: je souhaite utiliser des n° pour les fichiers
wave, de manière à garder l'ordre de ma playlist, pour celà, il me
faudrait des n° à 2 chiffres et là ma solution n'est pas bonne...


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

5 réponses

1 2
Avatar
Brice
On 2006-10-26, Bruno Desthuilliers wrote:
On 2006-10-24, Bruno Desthuilliers wrote:


(snip)


atta, je suis d'accord avec toi, y'a bcp de copier coller mais l'idée
générale, je l'ai comprise et j'ai adapté


s/adapté/copié-collé/

Escroc !-)


nan!!



Si si, j'insiste - mais ce n'est pas une insulte !-)


De plus il me semble toujours que "les" mplayer soient lancés les uns à
la suite des autres sans attendre que le précédent soit fini...


C'est le fonctionnement de os.system.



Correction : après lecture de la doc, je n'en suis plus si sûr. Anyway,
regarde du côté de subprocess...



correction: en fait les mplayer étaient lancés à la suite car la
commande comportait un & à la fin.


Lalala... Effectivement, ça m'avait échappé. C'est souvent le problème
quand on embarque un langage dans un autre - d'où l'intérêt, dans ce
cas, de bien "encapsuler" ces commandes pour que le reste du code en
soit exempt...

(snip)

sinon j'ai des bases de programmation en pascal et en c (qques cours en
école) mais je ne suis pas un fan de programmation qui ne me sert
qu'à améliorer l'ergonomie de mon environnement!


Bon, c'est sûr qu'on n'a pas la même approche, là !-)
En ce qui me concerne, si tu veux, un ordinateur n'a d'intérêt que pour
1. programmmer
2. dire des c...^Mdiscuter de programmation sur usenet
3. lire de la doc sur des langages ou des technos
4. programmer

J'ai même pas de carte son, c'est te dire...


bahhhh tu peux faire plein d'autres trucs avec un pc!!!!! vive le
multimedia!


donc je maîtrise plus
les script bash qu'autre chose!


Ce qui d'une part n'est pas si trivial que ça, et d'autre part est bien
plus puissant qu'on ne le pense souvent (Unix faisait déjà de la prog
par composants bien avant que ça ne devienne le buzz du jour).

Personnellement, je mets généralement moins de temps à hacker un
bricolage en Python qu'à lire les man pages et réussir à pondre un
script shell qui tienne la route. J'essaie de me soigner, mais j'ai
encore du travail...



moi ce qui me plait dans les *nix c'est le fait de pouvoir se faire son
environnement de travail et donc j'adore les scripts bash qui facilitent
la vie! au même titre de FVWM qui très chiant à configurer me permet
d'avoir l'interface graphique qui me sied le plus!

(snip)
Allez, je suis dans mon jour de bonté, je t'en remets une couche (pas
testé of course...):


presque sans faute! Seule correction:

source = song['~filename'].replace(" ","_").replace("'","'")

et non

source = song['~filename']

pour les noms de fichiers!


Sinon, ça tourne ?
(si oui, tu me dois une bière...)



mouai -;) en fait le message d'erreur (si erreur quelconque) ne marche
pas sinon oui ça tourne.


Maintenant il faut que je creuse pour trouver un moyen de lancer les
commandes en arrière plan les unes après les autres!


Tu disais plus haut (dans ce que j'ai snippé) que "détacher" la commande
(avec le & à la fin) te faisait perdre la main sur Quodlibet pendant ce
temps ?




en fait si je ne détache pas la commande, quodlibet se "bloque":
l'interface devient un gros tas de la couleur du theme gtk, tous les
boutons disparaissent, etc... et ce jusqu'à la fin de l'exécution du
plugin! en détachant la commande, j'ai plus ce pbm mais celui que TOUTES
les commandes sont lancées en même temps -- ou presque.

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

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



Ah, oui - ça c'est un truc à corriger. Si ton plugin n'est supposé
tourner que sous *n*x, peut-être regarer du côté de os.tmpnam() pour
créer un sous-répertoire par instance du plugin...



je pensais plutot essayer un truc avec un random dans le nom de fichier,
enfin ça reste de la cosmétique car je suis le seul à me servir de mon
pc!


J'ai du temps ce WE donc je vais creuser un peu plus sérieusement les
remarques précédentes!


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






Avatar
Bruno Desthuilliers
Brice wrote:
On 2006-10-26, Bruno Desthuilliers wrote:
On 2006-10-24, Bruno Desthuilliers wrote:
(snip)



Allez, je suis dans mon jour de bonté, je t'en remets une couche (pas
testé of course...):
presque sans faute! Seule correction:


source = song['~filename'].replace(" ","_").replace("'","'")

et non

source = song['~filename']

pour les noms de fichiers!
Sinon, ça tourne ?

(si oui, tu me dois une bière...)



mouai -;) en fait le message d'erreur (si erreur quelconque) ne marche
pas


"ne marche pas" est la plus mauvaise définition possible d'un
problème... Qu'est-ce qui se passe *effectivement* ?


NB : Pour ces appels, je n'ai fait que reprendre ton code. Je ne sais
même pas d'où vient la classe ErrorMessage, alors...


Maintenant il faut que je creuse pour trouver un moyen de lancer les
commandes en arrière plan les unes après les autres!
Tu disais plus haut (dans ce que j'ai snippé) que "détacher" la commande

(avec le & à la fin) te faisait perdre la main sur Quodlibet pendant ce
temps ?

en fait si je ne détache pas la commande, quodlibet se "bloque":

l'interface devient un gros tas de la couleur du theme gtk, tous les
boutons disparaissent, etc... et ce jusqu'à la fin de l'exécution du
plugin!


Pas très surprenant...

en détachant la commande, j'ai plus ce pbm mais celui que TOUTES
les commandes sont lancées en même temps -- ou presque.


Mouais.

Tu a deux problèmes à résoudre, là:
1/ tu ne veux pas continuer le traitement (appels à self.normalize() et
self.burn()) tant que tous les fichiers n'ont pas été convertis
2/ tu veux soit rendre la main au GUI soit afficher une barre de
progression pendant ce traitement

La solution canonique est de lancer la conversion dans un thread, et
d'attendre la fin de ce thread pour continuer le traitement. Google
"worker thread" devrait te mettre sur la bonne voie.

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

# XXX : pb potentiel: si deux utilisateurs utilisent ce plugin
# en meme temps, is vont se marcher sur les pieds...
destdir = "/tmp/cd_QL/"
Ah, oui - ça c'est un truc à corriger. Si ton plugin n'est supposé


tourner que sous *n*x, peut-être regarer du côté de os.tmpnam() pour
créer un sous-répertoire par instance du plugin...



je pensais plutot essayer un truc avec un random dans le nom de fichier,
enfin ça reste de la cosmétique car je suis le seul à me servir de mon
pc!


Oui, mais si tu veux contribuer ton plugin, ça devient problématique.
Pour ce que ça coûte, autant faire les choses proprement.

Merci


De rien.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"




Avatar
Brice
On 2006-10-30, Bruno Desthuilliers wrote:
Brice wrote:
On 2006-10-26, Bruno Desthuilliers wrote:
On 2006-10-24, Bruno Desthuilliers wrote:
(snip)



Allez, je suis dans mon jour de bonté, je t'en remets une couche (pas
testé of course...):
presque sans faute! Seule correction:


source = song['~filename'].replace(" ","_").replace("'","'")

et non

source = song['~filename']

pour les noms de fichiers!
Sinon, ça tourne ?

(si oui, tu me dois une bière...)



mouai -;) en fait le message d'erreur (si erreur quelconque) ne marche
pas


"ne marche pas" est la plus mauvaise définition possible d'un
problème... Qu'est-ce qui se passe *effectivement* ?


NB : Pour ces appels, je n'ai fait que reprendre ton code. Je ne sais
même pas d'où vient la classe ErrorMessage, alors...


Maintenant il faut que je creuse pour trouver un moyen de lancer les
commandes en arrière plan les unes après les autres!
Tu disais plus haut (dans ce que j'ai snippé) que "détacher" la commande

(avec le & à la fin) te faisait perdre la main sur Quodlibet pendant ce
temps ?

en fait si je ne détache pas la commande, quodlibet se "bloque":

l'interface devient un gros tas de la couleur du theme gtk, tous les
boutons disparaissent, etc... et ce jusqu'à la fin de l'exécution du
plugin!


Pas très surprenant...

en détachant la commande, j'ai plus ce pbm mais celui que TOUTES
les commandes sont lancées en même temps -- ou presque.


Mouais.

Tu a deux problèmes à résoudre, là:
1/ tu ne veux pas continuer le traitement (appels à self.normalize() et
self.burn()) tant que tous les fichiers n'ont pas été convertis
2/ tu veux soit rendre la main au GUI soit afficher une barre de
progression pendant ce traitement

La solution canonique est de lancer la conversion dans un thread, et
d'attendre la fin de ce thread pour continuer le traitement. Google
"worker thread" devrait te mettre sur la bonne voie.



skeud skeud skeud skeud et SKEUD!!!!!!!! nada! Je suis totalement planté
sur ce coup là! je sais pas comment m'en sortir! Ca fait trois jours que
je cherche et je ne trouve rien permettant de me débloquer et les 'pov'
tutos que je trouve ne vont pas bien loin, donc thread c'est du chinois
pour moi...

Je désespère pas (enfin si, et même beaucoup, et je sais pas comment me
soigner!)


HELP PLEASE!!!!


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

# XXX : pb potentiel: si deux utilisateurs utilisent ce plugin
# en meme temps, is vont se marcher sur les pieds...
destdir = "/tmp/cd_QL/"
Ah, oui - ça c'est un truc à corriger. Si ton plugin n'est supposé


tourner que sous *n*x, peut-être regarer du côté de os.tmpnam() pour
créer un sous-répertoire par instance du plugin...



je pensais plutot essayer un truc avec un random dans le nom de fichier,
enfin ça reste de la cosmétique car je suis le seul à me servir de mon
pc!


Oui, mais si tu veux contribuer ton plugin, ça devient problématique.
Pour ce que ça coûte, autant faire les choses proprement.

Merci


De rien.




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





Avatar
Bruno Desthuilliers

(snip)


en détachant la commande, j'ai plus ce pbm mais celui que TOUTES
les commandes sont lancées en même temps -- ou presque.


Mouais.

Tu a deux problèmes à résoudre, là:
1/ tu ne veux pas continuer le traitement (appels à self.normalize() et
self.burn()) tant que tous les fichiers n'ont pas été convertis
2/ tu veux soit rendre la main au GUI soit afficher une barre de
progression pendant ce traitement

La solution canonique est de lancer la conversion dans un thread, et
d'attendre la fin de ce thread pour continuer le traitement. Google
"worker thread" devrait te mettre sur la bonne voie.




skeud skeud skeud skeud et SKEUD!!!!!!!! nada! Je suis totalement planté
sur ce coup là! je sais pas comment m'en sortir! Ca fait trois jours que
je cherche et je ne trouve rien permettant de me débloquer et les 'pov'
tutos que je trouve ne vont pas bien loin, donc thread c'est du chinois
pour moi...


Quelques pistes sur les threads:

http://wikipython.flibuste.net/moin.py/QuestionsGenerales#head-8a86acdcb9f782d0a3ed3f193ab37879a5d757d7
http://heather.cs.ucdavis.edu/~matloff/Python/PyThreads.pdf.
http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/284631



Avatar
Brice
On 2006-11-02, Bruno Desthuilliers wrote:

(snip)


en détachant la commande, j'ai plus ce pbm mais celui que TOUTES
les commandes sont lancées en même temps -- ou presque.


Mouais.

Tu a deux problèmes à résoudre, là:
1/ tu ne veux pas continuer le traitement (appels à self.normalize() et
self.burn()) tant que tous les fichiers n'ont pas été convertis
2/ tu veux soit rendre la main au GUI soit afficher une barre de
progression pendant ce traitement

La solution canonique est de lancer la conversion dans un thread, et
d'attendre la fin de ce thread pour continuer le traitement. Google
"worker thread" devrait te mettre sur la bonne voie.




skeud skeud skeud skeud et SKEUD!!!!!!!! nada! Je suis totalement planté
sur ce coup là! je sais pas comment m'en sortir! Ca fait trois jours que
je cherche et je ne trouve rien permettant de me débloquer et les 'pov'
tutos que je trouve ne vont pas bien loin, donc thread c'est du chinois
pour moi...


Quelques pistes sur les threads:

http://wikipython.flibuste.net/moin.py/QuestionsGenerales#head-8a86acdcb9f782d0a3ed3f193ab37879a5d757d7
http://heather.cs.ucdavis.edu/~matloff/Python/PyThreads.pdf.
http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/284631




Bizarremment, rien n'est plus clair! J'ai beau essayer de comprendre le
truc mais je n'ai pas la logique pour. Je vois pas pourquoi un truc
aussi inchiable peut m'aider à faire simplement s'exécuter une commande
après l'autre en tâche de fond.

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




1 2