多嵌套引号

时间:2019-03-06 06:59:38

标签: python

我正在生成包含多个嵌套引号的命令,然后执行:

cmd = "python datax.py -p \"\"\" -Dpsql=\"DELETE FROM xxx WHERE date(yyy) = \'2019-02-02\'\" \"\"\" "
os.system(cmd)

cmd可以按预期生成:

python datax.py -p """ -Dpsql="DELETE FROM xxx WHERE date(yyy) = '2019-02-02'" """

但是,这似乎无法正常工作。系统仍返回诸如'(' unexpected...等的异常。

我也尝试了'''...''',但也不起作用。如何解决此问题,还有其他方法可以处理此案吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您需要为每个嵌套级别添加一个转义的反斜杠\\,因为您的外壳很可能不支持三引号。因此,它将三重引号和" -Dpsql="的前两个引号字符串解析为 DELETE FROM xxx WHERE date(yyy) = '2019-02-02'作为外壳程序代码。但是date(yyy)无效的Shell语法

不使用datax脚本即可重现此示例:

cmd = "python -c \"print(\"Hello (world!)\")\""
os.system(cmd)

失败

  意外令牌'('

附近的

语法错误

但是

cmd = "python -c \"print(\\\"Hello (world!)\\\")\""
os.system(cmd)

输出

  

你好(世界!)

我建议将您的代码更改为:

cmd = "python datax.py -p \" -Dpsql=\\\"DELETE FROM xxx WHERE date(yyy) = \'2019-02-02\'\\\"\" "

现在您的命令如下:

python datax.py -p " -Dpsql=\"DELETE FROM xxx WHERE date(yyy) = '2019-02-02'\""

您会发现-p参数有一个外部引号级别,而sql代码有一个内部引号级别。

答案 1 :(得分:1)

如果打印cmd,则会得到:

python datax.py -p """ -Dpsql="DELETE FROM xxx WHERE date(yyy) = '2019-02-02'" """

os.system所做的只是使用基本的.sh解释器打开一个shell并运行它。像"""这样的东西对sh来说是大忌(主要是因为您不确定它的作用-像是一个以另一个开头的空字符串之类的东西),当然,括号也很糟糕对于sh

您必须转义或确保它们在字符串中。您将必须转义所有内容或确保传递正确的sh字符串。这是一种方法:

cmd = r"""python datax.py -p ' -Dpsql=\" DELETE FROM xxx WHERE date(yyy) =  \\'2019-02-02\\'  \" ' """

r""保留反斜杠。打印结果为:

python datax.py -p ' -Dpsql=\" DELETE FROM xxx WHERE date(yyy) =  2019-02-02  \" '

我认为更好的选择是使用:

cmd = r"""python datax.py -p -Dpsql=" DELETE FROM xxx WHERE date(yyy) =  '2019-02-02' " """

因此,我放弃了'的一个级别。现在,只需修复datax.py来解析argv,以更好地满足您的需求(在-p之后获取所有内容)。这也将使直接调用它变得更加容易。打印时:

python datax.py -p -Dpsql=" DELETE FROM xxx WHERE date(yyy) =  '2019-02-02' "

argparse很好地处理了这些事情。