我正在生成包含多个嵌套引号的命令,然后执行:
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...
等的异常。
我也尝试了'''...'''
,但也不起作用。如何解决此问题,还有其他方法可以处理此案吗?任何帮助表示赞赏。
答案 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
很好地处理了这些事情。