2010-10-27 89 views
1

我想使用python自動化一些大數據文件處理。困惑python subprocess內循環

的處理的垂耳被鏈接,即SCRIPT1寫入一個文件,即隨後由SCRIPT2處理,則通過script3等SCRIPT2的輸出

我正在使用的螺紋上下文子模塊。

我有一個類創建鏈接腳本的元組 (「scr1.sh」,「scr2.sh」,「scr3.sh」)。

然後使用像

for script in scriplist: 
    subprocess.call(script) 

我的問題呼叫中的另一類是在for循環,是每個腳本後,才subprocess.call(SCRIPT1)稱爲返回一個成功RETCODE?

或者是因爲我使用的是subprocess.call,所有三個都被調用一個接一個,沒有使用「睡眠」或「等待」,我想確保第二個腳本只在第一個腳本啓動後纔開始過度。

編輯:pydoc說 「subprocess.call(* popenargs,** kwargs) 帶參數運行命令,等待命令完成,然後返回returncode屬性。

所以在for循環(上面)中,是否在迭代到下一個腳本之前等待每個retcode。

我是線程新手。我在此附上運行分析的類的精簡代碼。 subprocess.call循環是這個類的一部分。

class ThreadedDataProcessor(Thread): 
      def __init__(self, in_queue, out_queue): 
       # Uses Queue 
       Thread.__init__(self) 
       self.in_queue = in_queue 
       self.out_queue = out_queue 
      def run(self): 
       while True: 
        path = self.in_queue.get() 
        if path is None: 
         break 
        myprocessor = ProcessorScriptCreator(path) 
        scrfiles = myprocessor.create_and_return_shell_scripts() 

       for index,file in enumerate(scrfiles): 
        subprocess.call([file]) 
        print "CALLED%s%s" % (index,file) *5 
       #report(myfile.describe()) 
       #report("Done %s" % path) 
       self.out_queue.put(path) 
       in_queue = Queue() 
+0

抱歉不知道關於stackoverflow上的「接受率」。 – harijay 2010-10-27 11:27:22

+0

@Rafe Kettler:我在文檔中閱讀關於subprocess.call()的部分。如果我沒有弄錯,for循環會在下一輪for循環之前等待每個retcode - 是這種情況嗎? – harijay 2010-10-27 15:26:42

回答

2

循環將依次調用每個腳本,等到它完成,然後無論以前調用的成功或失敗的呼叫下一個。你可能想說:

try: 
    map(subprocess.check_call, script_list) 
except Exception, e: 
    # failed script 

一個新的線程將每次調用run啓動,以及當run完成結束。您在一個線程內使用子進程遍歷腳本。

您應該確保每個線程中的每組調用都不會影響來自其他線程的其他調用。例如,嘗試從多個線程中的腳本調用同時讀取和寫入同一個文件。