Почему код не выполняется последовательно в цикле python for

#python

#python

Вопрос:

У меня есть следующие функциональные возможности в скрипте Python:

 invoke the shell to create some files(it is a split command from the shell)
for f in a folder
    open f and write something

commands..
 

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

На самом деле перед циклом файлы создаются с помощью команды оболочки, вызываемой с помощью popen.subprocess . Происходит то, что в некоторой степени цикл for выполняется, когда popen.subprocess не был завершен.Как я могу заставить программу запускать цикл for, как только команда оболочки завершается?

Ответ №1:

Если вы не сбросили или не закрыли файлы, возможно, они еще не были записаны. Объект file будет неявно закрыт сборкой мусора, но это может произойти недостаточно скоро для вашего использования.

 for f in files:
    out = open(f)
    out.write(something)
    out.close()

do_more.stuff()
 

Это можно выразить более кратко с помощью

 for f in files:
    with open(f) as out:
        out.write(something)

do_more.stuff()
 

так что закрытие выполняется неявно при выходе из with блока.

Комментарии:

1. Гораздо лучший способ сделать это with open(f) as out — закрыть файл, даже если исключения, return , break или что-то еще будет пропущено out.close .

2. @delnan: Ах да. Мой фон Python-2.4 просвечивает; нужно поработать над этим. Хотя я думаю, что OP должен понимать первую форму, а затем использовать вторую.

3. да, я закрываю файлы. Смотрите Ответ, который теперь обновляется

4. Ираклис: Тогда вам нужно показать свой код, а не какое-то его смутное приближение. И точно опишите, какое поведение вы видите. На данный момент ваш вопрос полностью изменился по сравнению с тем, каким он был изначально.

Ответ №2:

Я придумал это:

 pid=subprocess.Popen(...)//invoke the shell command which creates a bunch of files
pid.wait()//wait until terminates
for f in a folder
     open f and write something
commands..
 

Это решило мою проблему

Комментарии:

1. В этом случае вы должны использовать subprocess.call , если это доступно для вашей версии Python (добавлено в Python 2.5). subprocess.Popen не является блокирующей командой.