【问题标题】:quotations not bein preserved by echo command when executing from python从 python 执行时,echo 命令不会保留引号
【发布时间】:2015-11-11 23:13:02
【问题描述】:

在我的 python 脚本中,我有以下行 -

oscmd = "sqlite3 $OMC_DB_DIR/.mcdata \"UPDATE IPADDRESS SET DESCRIPTION = 'NODE0' WHERE HOST LIKE '%-n1.%'\" >/dev/null" . 

我使用 subprocess.popen 运行此命令。 每当命令失败时,我想在控制台上显示失败的命令。

所以我做 oscmd_display= "echo \"" + oscmd + "\"" 。 我不只是使用 print 而是使用 echo 因为我希望像 $OMC_DB_DIR 这样的环境变量被解释并显示它们的实际值。

但是,当我运行并且命令失败时,我会收到类似 -

的消息
[ERROR   ]  Executing the following command failed :
    sqlite3 /opt/store/.mcdata UPDATE IPADDRESS SET DESCRIPTION=NODE0 WHERE HOST LIKE %-n1.% >/dev/null  

也就是说,所有的引号都去掉了。

我想保留命令中的 "" 和 '' 引号。

有人可以提出解决方案吗?

【问题讨论】:

  • set -x; 添加到命令的开头,shell 会在运行时显示该行。您不能可靠地将命令粘贴在字符串中并让引用正常工作。您可以将其用于打印,但不值得。

标签: python bash sqlite echo quotes


【解决方案1】:

与其将整个命令行嵌入到一个字符串中,不如将包含命令名称和参数的列表传递给subprocess.Popen

p = subprocess.Popen(["sqlite3",
                      # I'm assuming this is an environment variable
                      os.environ['OMC_DB_DIR'] + "/.mcdata",
                      "UPDATE IPADDRESS SET DESCRIPTION = 'NODE0' WHERE HOST LIKE '%-n1.%'",
                      stdout=os.devnull])

(如果您使用的是 Python 2.7 之前的版本,请将 os.devnull 替换为 open('/dev/null', 'w')。)

【讨论】:

  • 我们可以在不改变 subprocess.Popen 的使用方式的情况下做到这一点吗?
  • 我不会。不要围绕您希望日志消息的显示方式构建代码。
【解决方案2】:

尝试对最外层的引号使用三引号:

oscmd = """sqlite3 $OMC_DB_DIR/.mcdata \"UPDATE IPADDRESS SET DESCRIPTION = 'NODE0' WHERE HOST LIKE '%-n1.%'\" >/dev/null""" 

【讨论】:

  • 不起作用。无论在外部 oscmd= ... 中使用什么引号(“”、''、“”“)。
  • 不起作用。不管在外层的 oscmd=... 命令中使用什么引号(" ", ' ', " " "),当它最终使用时, oscmd_display= "echo \"" + oscmd + "\"" ,命令被解释为 echo "sqlite3 $OMC_DB_DIR/.mcdata "UPDATE IPADDRESS SET DESCRIPTION ='NODE0' WHERE HOST LIKE '%-n1.%'" >/dev/null"
【解决方案3】:

有几个级别的(去)引用正在进行。

在纯 SQL 中,字符串必须使用单引号:

SELECT 'some string';

在shell中,引号用于禁用特殊的shell字符,因此必须将它们转义才能在被调用的程序中结束:

sqlite3 filename.db 'SELECT \'some string\';'

在 Python 中,您必须同时转义反斜杠和引号,以便将它们提供给 shell:

oscmd = 'sqlite3 filename.db \'SELECT \\\'some string\\\';\'';

(如何混合'" 留作练习......)

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多