Пока у меня установлены соответствующие программы - fortune
не установлен по умолчанию в Ubuntu 16.04 - я могу использовать следующую команду, чтобы иметь функциональность для работы с текстом моего компьютера скажите мне, чтобы вернуться к работе, а затем прочитал мне вдохновляющие цитаты из fortune
:Использовать подстановку команд с backticks внутри subprocess.call()
spd-say "get back to work and remember `fortune`"
Здесь я использую подстановку команд с обратными кавычками, чтобы добавить результат вызова fortune
команду на строку текста для чтения , В Python, я могу использовать subprocess
сделать это:
subprocess.call(['spd-say', 'get back to work'])
Однако команда замещение не обратные кавычки появляются здесь работать:
subprocess.call(['spd-say', 'get back to work and remember `fortune`'])
В этом случае, я услышу: «вернуться работать и помнить фортуну ». Я предполагаю, что это потому, что subprocess
передает строку с одной кавычкой, и такая подстановка команд работает только в строках с двойными кавычками.
Я пробовал различные решения, в том числе используя двойные кавычки, двойные кавычки внутри одинарных кавычек, но я думаю, что он все еще передает строку с одной кавычкой с двойными кавычками внутри, а не с двойной кавычкой.
Я также пытался писать всю команду в виде одной строки, и разорвать его с помощью shlex.split()
:
import shlex
command = 'spd-say "get back to work and remember `fortune`"'
command_args = shlex.split(command)
Но это дает мне:
['spd-say', 'get back to work and remember `fortune`']
Опять же, не двойные кавычки.
Есть ли способ, чтобы заставить обернуть один аргумент в двойных кавычках (если это действительно проблема), или в противном случае труба выход команды fortune
к spd-say
так, как описано выше, с использованием subprocess.call()
?
В стороне - я настоятельно рекомендую избегать 'shlex.split()' в пользу жесткого кодирования ваших списков: как человек, вы точно знаете *, как вы хотите, чтобы они разобрались, так что вы могли бы также передать их в этом виде (также это означает, что читателю нужно только знать синтаксис синтаксиса * - синтаксис Python - vs two, Python и shell). Первый подход позволяет легко попасть в проблему, выполняя что-то вроде 'shlex.split (« your-command --file =% s »% filename)», который может расширяться до нескольких аргументов, если имя файла содержит пробелы, ['your-command', '--file =% s'% filename] ', что недвусмысленно. –