2017-08-03 53 views
0

我想運行一個特定的命令,因爲我的子分區中有匹配的文件。每個文件都是這樣命名的:sub-01_T1w,sub-02_T1w ...。我試圖運行的命令如下所示:「bet -F -m」。Python:運行os.system以匹配文件

編輯我的問題:每次運行腳本時,都不會替換通配符。文件路徑是正確的,但os命令每次都是子[0-9] [0-9]而不是:sub-01,sub-02,...。

我第一次嘗試是這樣的:

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

所以...什麼是你的問題? – yuhow5566

+0

我在這裏找不到問題。你的嘗試是否奏效?如果不是,它是如何失敗的?它有什麼作用?有錯誤嗎?它是什麼?如果你願意,我還有更多的問題......但最好是完全重寫這個問題 –

回答

0

你可能誤會了怎麼glob.glob作品。它根據作爲參數給出的模式計算文件路徑列表。

你不應該傳給glob.globos.system的結果,這可能不是你想要做的。

嘗試用這樣的解決你的問題:

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']) 

獎勵:%s在需要時支持os.path.join被拆除。另外,我在最後一行使用了str.format,因爲我發現它更清晰。這是一個風格問題,做你喜歡

編輯:取代subproces.callos.system,爲suggested by STD

+0

感謝您的幫助! – STD

+0

@STD最好避免使用'os.system'並使用'subprocess.call'來代替 - 這樣你就不必擔心外殼的轉義參數了......所以上面的代碼就是'subprocess.call (['bet',file,file +'_ T1w_brain','-f','-m'])' –

+0

@Jon Clements謝謝你,你的代碼工作正常! – STD