2017-08-03 3 views
0

Je souhaite exécuter une commande spécifique aussi souvent que des fichiers correspondants sont présents dans mes sous-répertoires. Chaque fichier est nommé comme ceci: sub-01_T1w, sub-02_T1w .... La commande que j'essaie de lancer ressemble à ceci: "bet -F -m".Python: Exécuter os.system pour les fichiers correspondants

Modifier Ma question: Chaque fois que je lance le script, aucun des caractères génériques n'est remplacé. Les chemins d'accès aux fichiers sont corrects, mais la commande os est à chaque fois sub- [0-9] [0-9] au lieu de: sub-01, sub-02, ....

Ma première tentative ressemble à ceci:

import glob 
import os 

path = '/home/nico/Seminar/demo_fmri/' 
subdirs = glob.glob('%s/sub-[0-9][0-9]'%(path)) 

for dir in subdirs: 
    print dir 
    glob.glob(os.system("bet %s/anat/sub-[0-9][0-9]_T1w %s/anat/sub-[0-9][0-9]_T1w_brain -F -m"%(dir,dir))) 
+0

Alors ... ce que vous est la question? – yuhow5566

+0

Je ne trouve pas de question ici. Est-ce que votre tentative fonctionne? Si non, comment cela échoue-t-il? Qu'est ce que ça fait? Y a-t-il une erreur? Qu'Est-ce que c'est? J'ai plus de questions si vous voulez ... Mais il est probablement préférable que vous réécrire entièrement la question –

Répondre

0

Vous avez probablement mal compris comment fonctionne glob.glob. Il calcule une liste de chemins de fichiers en fonction du motif que vous avez donné en argument.

Vous ne devriez pas passer à glob.glob le résultat de os.system, ce n'est probablement pas ce que vous voulez faire.

Essayez de résoudre votre problème avec quelque chose comme ceci:

import glob 
import os 
import subprocess 

path = '/home/nico/Seminar/demo_fmri/' 
subdirs = glob.glob(os.path.join(path, 'sub-[0-9][0-9]')) 

for dir in subdirs: 
    print dir 
    for file in glob.glob(os.path.join(dir, 'anat/sub-[0-9][0-9]_T1w')): 
     subprocess.call(['bet', file, file+'_brain', '-f', '-m']) 

Bonus: %s ont été enlevés en faveur de os.path.join en cas de besoin. En outre, j'ai utilisé str.format en dernière ligne puisque je le trouve plus clair. Il est une question de style, faites comme vous préférez

Edit: remplacé par os.systemsubproces.call, comme suggested by STD

+0

Merci pour votre aide! – STD

+0

@STD Il est également préférable d'éviter 'os.system' et d'utiliser' subprocess.call' à la place - de cette façon, vous n'avez pas à vous soucier d'échapper des arguments pour le shell etc ... donc ce qui précède serait 'subprocess.call (['bet', fichier, fichier + '_ T1w_brain', '-f', '-m']) ' –

+0

@Jon Clements Merci, votre code fonctionne bien! – STD