2010-10-27 3 views
1

Я пытаюсь автоматизировать обработку больших файлов данных с помощью python.confused о подпроцессе python внутри цикла

обкорнать обработки прикован, т.е. script1 записывает файл, который затем обрабатывается Скрипт2, то выход Скрипт2 путем Script3 и т.д.

Я использую подпроцесс модуля в резьбовом контексте.

У меня есть один класс, который создает кортежи скопированных скриптов («scr1.sh», «scr2.sh», «scr3.sh»).

Тогда другой класс, который использует вызов как

for script in scriplist: 
    subprocess.call(script) 

Мой вопрос заключается в том, что в этом для цикла, это каждый скрипт вызывается только после того, как subprocess.call (script1) возвращает успешный RETCODE ?.

Или все три вызова вызываются сразу после друг друга, так как я использую subprocess.call, не используя «sleep» или «wait», я хочу убедиться, что второй скрипт запускается только после первого над.

Edit: pydoc говорит "subprocess.call (* popenargs ** kwargs) команду Run с аргументами Дождитесь завершения команды, а затем вернуть атрибут код возврата.."

Итак, в цикле for (выше) он ждет каждого повторного кода перед повторением к следующему скрипту.

Я новичок в нарезке. Я прикрепляю урезанный код для класса, который проводит анализ здесь. Подпроцесс цикла является частью этого класса.

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

+0

@Rafe Kettler: Я прочитал раздел о subprocess.call() в документе. Если я не ошибаюсь, цикл for будет ждать каждого повторного кода до следующего раунда цикла for - это случай? – harijay

ответ

2

Цикла будет последовательно вызывать каждый сценарий, подождите, пока он не закончит, а затем вызвать следующую независимо от успеха или неудач предыдущего вызова. Вы, наверное, хотите сказать:

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

Новый поток будет начинаться с каждым вызовом run, а также заканчивается, когда run делаются. Вы перебираете скрипт подпроцессом внутри одного потока.

Вы должны убедиться, что каждый набор вызовов в каждом потоке не будет влиять на другие вызовы из других потоков. Например, попробуйте прочитать и записать в один и тот же файл из вызова сценария в нескольких потоках одновременно.

Смежные вопросы