«git tag -l v1.1. {[0-9], [0-9] [0-9]}» работает в оболочке, но не в подпроцессе.Popen () - PullRequest
0 голосов
/ 28 декабря 2018

Когда я запускаю git tag -l v1.1.{[0-9],[0-9][0-9]} в своей оболочке, я получаю результаты, однако

def run_command(cmd_args, number_of_retry=5,
                timeout_in_second=90, suppress_output=False):
    proc = subprocess.Popen(cmd_args,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

    timer = threading.Timer(timeout_in_second, proc.kill)

    timer.start()
    out, err = proc.communicate()
    timer.cancel()

    if proc.returncode and number_of_retry >= 1:
        if not suppress_output:
            print('Command "{}" failed/timeout, retrying...'.format(
                ' '.join(cmd_args)))
        return run_command(cmd_args,
                           number_of_retry - 1,
                           timeout_in_second + 10,
                           suppress_output=suppress_output)

    return proc.returncode, out, err

return_code, out, _ = run_command(
    ['git', 'tag', '-l', "v1.1.{[0-9],[0-9][0-9]}"],
    number_of_retry=0,
    suppress_output=False)

не дает результатов.Изменение шаблона в моем коде на v1.1. [0-9] [0-9] дает результаты, которые совпадают, как и v1.1. [0-9], поэтому проблема с скобками.Кто-нибудь знает, как это может быть?Есть ли другой способ сказать то же выражение или, по крайней мере, увидеть запуск подпроцесса bash, чтобы я мог убедиться, что выполняется правильная команда?(подпроцесс и потоки являются модулями Python)

1 Ответ

0 голосов
/ 28 декабря 2018

Синтаксис фигурных скобок и запятых («расширение скобок») в v1.1.{[0-9],[0-9][0-9]} - это инструкция для вашей оболочки, а не git;он говорит оболочке разделить аргумент на два (после чего, поскольку они содержат символы без кавычек, глобус по умолчанию будет пытаться расширить каждый из этих результирующих аргументов как глобус - надеюсь, вы на самом деле не намерены использовать такое поведение, итаким образом, не будет возражать против его исчезновения), а затем передать git два отдельных аргумента, по одному для содержимого с каждой стороны запятых в фигурных скобках.

При отсутствии ранее обсуждавшегося сглаживания,результат этого расширения оболочки эквивалентен следующему коду Python:

run_command(['git', 'tag', '-l', 'v1.1.[0-9]', 'v1.1.[0-9][0-9]'],
            number_of_retry=0, suppress_output=False)

Если вы на самом деле делаете , полагайтесь на оболочку, чтобы заменить v1.1.[0-9] списком записей втекущий каталог, соответствующий этому шаблону, если такие записи существуют, эквивалент нативного Python будет выглядеть так:

# to behave like default bash behavior (without running ''shopt -s nullglob''):
import glob
def expandGlob(word):
    return glob.glob(word) or [word]

run_command(['git', 'tag', '-l'] + expandGlob('v1.1.[0-9]') + expandGlob('v1.1.[0-9][0-9]'),
            number_of_retry=0, suppress_output=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...