[英]why does this python script not work?
我的python腳本是以下代碼:
1 import subprocess
2
3 # initial 'output' to make
4 r0 = 21
5 # number of runs to make
6 rn = 10
7
8 rf = r0+rn
9
10 for i in range(r0, rf):
11 #output directory
12 opt_dir = 'output'+str(i)
13 #put it in this output directory
14 popt_dir = './output'+str(i)
15
16 subprocess.call(['mkdir', opt_dir])
17 subprocess.call(['./exp_fit', 'efit.inp'])
18 subprocess.call(['mv', 'at*', popt_dir])
目的是這樣的:
我有一個名為“ exp_fit”的程序,該程序需要一個輸入文件“ efit.inp”。 對./exp_fit efit.inp
一次調用將創建名為'at0_l0_l0','at0_l1_l-1'等的輸出文件(總共475個文件以'at'開頭)。
現在,我一直在通過運行'exp_fit'生成數據文件,然后使用以下bash命令創建輸出目錄並將其移至輸出目錄:(例如,使用我的代碼的第20次運行)
mkdir output20
mv at* ./output20
所以我認為我的腳本應該做同樣的事情。 但是,它僅執行以下操作:
(1)正確生成所有輸出文件(以'at'開頭的475個文件)(2)正確創建所需目錄(output21-output30)(3)不會,但是,正確移動所有以'開頭的文件在”進入所需目錄。 為什么是這樣? 第18行的調用是否應該正確執行命令以將我所有以'at'開頭的文件移動到所需目錄中?
我應該用bash而不是python編寫此腳本嗎? 這有什么問題?
不要為您可以從Python本地完成的事情發出subprocess
調用。 要移動文件/目錄,只需使用os.rename
。
要創建目錄,請使用os.mkdir
。
要執行外部程序,使用subprocess
是正確的工具。
問題是此子流程命令
subprocess.call(['mv', 'at*', './output20'])
與在提示符下鍵入此命令不同
$ mv at* ./output20
在后一種情況下,bash glob擴展將單個at*
參數轉換為與mv
命令匹配的文件名的參數列表。 因此內核將第二個視為
['mv', 'at0_l0_l0', 'at0_l1_l-1', './output20']
kev的答案告訴Python將命令通過外殼傳遞,因此會發生轉義。
但是更好的解決方案是使用glob
模塊和os.rename
庫,而不調用子os.rename
。 創建子流程非常昂貴,並且使用shell=True
可能會導致安全漏洞,因此最好避免這種習慣。
(實際上,我建議創建輸出目錄,切換到該目錄,然后從該目錄中運行exp_fit
程序。然后,您不必移動輸出。請首先嘗試。)
如果shell=True
,則可執行參數指定要使用的外殼。
在Unix上,默認shell是/bin/sh
。
subprocess.call(['mv', 'at*', popt_dir], shell=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.