cmd.split() не работает:
cmd = f'git log --all --grep = "fixed bug" --pretty = "%H|%an"'
process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Сгенерируйте эту ошибку:
Вместо этого с этим кодом он работает.
cmd = f'git log --reverse --pretty=format:"%H|%an|%at"'
Это не проблема «ошибок», потому что оставление только «исправленного» ничего не генерирует. Кроме того, эти 2 слова присутствуют в коммитах. Боюсь, это проблема "--grepp".
Дубликат stackoverflow.com/questions/27533176/…
Что я должен использовать? Можете ли вы написать мне полную строку?
result = subprocess.run(shlex.split('git log --all --grep = "fixed bug" --pretty = "%H|%an"'), check=True, capture_output=True, text=True)
; возможно, см. также stackoverflow.com/questions/4256107/…Также, пожалуйста не публикуйте изображения кода, сообщения об ошибках или другие текстовые данные.
Прежде чем я использовал process.communicate(), что мне теперь использовать?
result.stdout
содержит стандартный вывод; result.stderr
стандартная ошибка. Если вы не нашли документацию, она находится по адресу docs.python.org/3/library/asyncio-subprocess.htmlРазделить, разделить, используя пробелы в качестве разделителей.
In [2]: cmd = f'git log --all --grep = "fixed bug" --pretty = "%H|%an"'
In [3]: cmd.split()
Out[3]: ['git', 'log', '--all', '--grep = "fixed', 'bug"', '--pretty = "%H|%an"']
Таким образом, команда, которая выполняется, выглядит примерно так:
git log --all --grep=fixed bug --pretty = "%H|%an"
что неверно, поскольку «исправленная ошибка» воспринимается как 2 разных аргумента
Похоже, что предпочтительным решением является использование функции shlex.split
, которая учитывает это.
In [5]: shlex.split(cmd)
Out[5]: ['git', 'log', '--all', '--grep=fixed bug', '--pretty=%H|%an']
Разве два метода не должны делать одно и то же? Он форматирует текст по-другому, и теперь я не могу продолжать. Разве нет способа сделать "--pretty" по-другому? Что мне нужно сделать, так это найти несколько коммитов с клавиатурой.
Конечно, нет; он просто разбивается на пробелы. Используйте
shlex.split()
(и не используйтеPopen
для случаев, с которыми могут справитьсяrun
и др., Как указано в документацииsubprocess
).