【问题标题】:In Python3/OS X, how to pass a string with apostrophe to a terminal command?在 Python3/OS X 中,如何将带撇号的字符串传递给终端命令?
【发布时间】:2016-08-19 09:48:47
【问题描述】:

我有一个 Python 3 应用程序,它应该在某个时候将一个字符串放入剪贴板。我正在使用系统命令echopbcopy,它工作正常。但是,当字符串包含撇号(谁知道,可能还有其他特殊字符)时,它会以错误退出。这是一个代码示例:

import os

my_text = "Peoples Land"
os.system("echo '%s' | pbcopy" % my_text)

它工作正常。但是如果将字符串更正为“People's Land”,则会返回此错误:

sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file

我想我需要在将字符串传递给 shell 命令之前以某种方式对字符串进行编码,但我仍然不知道如何。实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: macos python-3.x echo clipboard pbcopy


    【解决方案1】:

    对于字符串中的撇号:

    • 您可以使用'%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))
      

    【讨论】:

    • 我试图在我的代码中实现这个建议,但我很难弄清楚它失败的原因。我发现在使用shlex.quote() 时,我仍然必须像您一样删除单引号。现在它工作正常;)
    【解决方案2】:

    这实际上与 shell 转义有关。

    在命令行中试试这个:

    echo 'People's Land'
    

    还有这个

    echo 'People'\''s Land'

    在 python 中,这样的东西应该可以工作:

    >>> import os
    >>> my_text = "People'\\''s Land"
    >>> os.system("echo '%s' > lol" % my_text)
    

    【讨论】:

    • 是否有一个 python 函数可以进行这种转义?我正在处理输入到数据库中的值,因此最好让代码进行该转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多