Проблема с разделением строки cmd в python

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".

Конечно, нет; он просто разбивается на пробелы. Используйте shlex.split() (и не используйте Popen для случаев, с которыми могут справиться run и др., Как указано в документации subprocess).

tripleee 08.02.2023 20:53

Дубликат stackoverflow.com/questions/27533176/…

tripleee 08.02.2023 20:55

Что я должен использовать? Можете ли вы написать мне полную строку?

Marriv99 08.02.2023 20:57
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/…
tripleee 08.02.2023 20:59

Прежде чем я использовал process.communicate(), что мне теперь использовать?

Marriv99 08.02.2023 21:09
result.stdout содержит стандартный вывод; result.stderr стандартная ошибка. Если вы не нашли документацию, она находится по адресу docs.python.org/3/library/asyncio-subprocess.html
tripleee 08.02.2023 21:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разделить, разделить, используя пробелы в качестве разделителей.

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" по-другому? Что мне нужно сделать, так это найти несколько коммитов с клавиатурой.

Marriv99 08.02.2023 22:33

Другие вопросы по теме