2017-01-05 1 views
0

Так что я хочу, чтобы позвонить на скрипт из Python, используяПочему подпроцесс цикл над тем же набором файлов через и над

from subprocess import call 

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

 for path, subdirs, files in os.walk(dir_path): 
      for name in files: 
       if name.endswith(".avg"): 
        os.chdir(os.path.join(path)) 
        call("shell_script *avg", shell=True) 
        print("creating new file for... " + name) 

Но это только продолжает цикл над тем же набором файлов снова и снова, и в конечном счете, как после 5 итераций он будет переходить к следующему набору файлов и сделать то же самое , Я только нашел это, потому что я смотрю на ядро ​​и вижу, что он снова и снова выполняет один и тот же сценарий оболочки на одном и том же файле. Где я здесь не так?

ответ

1

call("shell_script *avg", shell=True) вызывает shell_script по каждому файлу, заканчивающемуся avg. Цикл делает это один раз для каждого файла, заканчивающегося avg.

1

Вы продолжаете изменять текущий рабочий каталог os.chdir(os.path.join(path)). Если вы используете относительный путь в dir_path, вы постоянно меняете базу ходьбы. Вместо этого пропустите изменение каталога в основной программе и вместо этого установите его в вызове подпроцесса. Кроме того, вам нужно передать фактическое имя файла вместо glob.

for path, subdirs, files in os.walk(dir_path): 
    for name in files: 
     if name.endswith(".avg"): 
      call("shell_script {}".format(name), shell=True, cwd=path) 
      print("creating new file for... " + name) 
+0

ооо я думал, что это будет изменить каталог, чтобы убедиться, что новый файл будет создан в той же директории, он нашел. Если я хотел бы добавить заданы параметры я просто положить каждый аргумент в кавычках и его значение, как так ? call ("shell_script.sh", "arg1", "value_for_arg1", shell = True, cwd = path) или вызывает оболочку = Истинная часть означает, что оболочка перенаправляет аргументы за сценариями и сценарий и аргументы должны быть одной длинной строкой, подобной так: call ("shell_script.sh arg1 value_for_arg1", shell = True, cwd = path) – e9e9s

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