Уборка нескольких каталогах построить


Я чищу каталоги, производимые гномом построить инструмент, JHBuild. Этот инструмент либо загружает архивы или клоны Git-репозитории, в зависимости от настройки. После этого он приступает к компиляции (а затем установку). Время от времени, что-то не так, и мне нужно, чтобы очистить каталоги построить, так что я могу начать с нуля (потому что я не знаю как исправить некоторые из этих проблем).

Вот как я сделал это, и я хочу, чтобы вы сказать мне, если он может быть улучшен:

import os
import subprocess

top_level = os.path.expanduser("~/src/gnome")
for filename in os.listdir(top_level):
    full_path = "{}/{}".format(top_level, filename)
    if os.path.isdir(full_path):
        cmd = "cd ~/src/gnome/{} && git clean -dfx".format(filename)
        if subprocess.call(cmd, shell=True) != 0:
            cmd = "cd ~/src/gnome/{} && make distclean".format(filename)
            if subprocess.call(cmd, shell=True) != 0:
                cmd = "cd ~/src/gnome/{} && make clean".format(filename)
                subprocess.call(cmd, shell=True)


267
3
задан 26 марта 2011 в 04:03 Источник Поделиться
Комментарии
1 ответ

full_path = "{}/{}".format(top_level, filename)

Вы можете использовать ОС.путь.присоединиться(top_level, именем) для этого. Таким образом, он будет также работать на любой системе, которая не использует / каталог сепаратора (это не совсем реальна, в этом случае, но с использованием ОС.путь.присоединиться не стоить вам ничего, и это хорошая практика, чтобы привыкнуть).

cmd = "cd ~/src/gnome/{} && git clean -dfx".format(filename)

Прежде всего, орфографии ~/src/и Гном снова является плохой практикой. Таким образом, если вы хотите изменить его на другой каталог, вам придется изменить его во всех 4 местах. У вас уже есть в top_level переменной, так что вы должны использовать эту переменную везде.

На секунду подумал, что вы должны на самом деле не использовать top_level здесь, потому что то, что ты делаешь, ты присоединишься к top_level и именем. Однако ты уже сделал это с full_path. Поэтому вы должны просто использовать full_path здесь.

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

if os.path.isdir(full_path):
os.chdir(full_path)
if subprocess.call("git clean -dfx", shell=True) != 0:
if subprocess.call("make distclean", shell=True) != 0:
subprocess.call("make clean", shell=True)

(Обратите внимание, что с full_path - это абсолютный путь, это не имеет значения, что вы не перейти обратно в конце каждой итерации.)

Еще одна хорошая привычка-не использовать оболочки=истина, но вместо того, чтобы пройти в список команды и аргументы, например, подпроцесс.вызов(["сделать", "чистые"]). Это не делает разницы в этом случае, но в тех случаях, когда параметры могут содержать пробелы, это избавит вас от экранирования.

3
ответ дан 26 марта 2011 в 04:03 Источник Поделиться