В Python3/OS X как передать строку с апострофом в терминальную команду?
У меня есть приложение Python 3, которое должно в какой-то момент поместить строку в буфер обмена. Я использую системные команды echo
а также pbcopy
и это работает правильно. Однако, когда строка содержит апостроф (и кто знает, может быть, другие специальные символы), она завершается с ошибкой. Вот пример кода:
import os
my_text = "Peoples Land"
os.system("echo '%s' | pbcopy" % my_text)
Работает нормально. Но если вы исправите строку как "Народная земля", она вернет эту ошибку:
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
Я думаю, мне нужно как-то кодировать строку перед передачей ее командам оболочки, но я все еще не знаю как. Каков наилучший способ сделать это?
2 ответа
Для апострофов в строке:
- Ты можешь использовать
'%r'
вместо'%s'
my_text = "People's Land" os.system("echo '%r' | pbcopy" % my_text)
Чтобы получить экранированную версию строки:
Ты можешь использовать
shlex.quote()
import os, shlex my_text = "People's Land, \"xyz\", hello" os.system("echo %s | pbcopy" % shlex.quote(my_text))
Это больше связано с экранированием оболочки.
Попробуйте это в командной строке:
echo 'People's Land'
и это
echo 'People'\''s Land'
В Python примерно так должно работать:
>>> import os
>>> my_text = "People'\\''s Land"
>>> os.system("echo '%s' > lol" % my_text)