簡體   English   中英

為什么這個python腳本不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM