запутался в подпроцессе Python внутри цикла for - PullRequest
1 голос
/ 27 октября 2010

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

Цикл обработки цепочки, т. Е. Script1 записывает файл, который затем обрабатывается script2, затем вывод script2 с помощью script3 и т. Д.

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

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

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

for script in scriplist:
    subprocess.call(script)

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

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

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

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

Я новичок в потоках. Я прилагаю урезанный код для класса, который выполняет анализ здесь. Цикл 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()

1 Ответ

2 голосов
/ 30 октября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...