В 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)
Другие вопросы по тегам