从python执行时,echo命令不保留引用

2024-09-21 05:40:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我使用子流程.popen. 每当命令失败时,我想在控制台上显示失败的命令。你知道吗

所以我做了oscmd_display= "echo \"" + oscmd + "\""。 我不仅使用print,还使用echo,因为我希望对$OMC\u DB\u DIR这样的环境变量进行解释并显示它们的实际值。你知道吗

但是,当我运行命令失败时,会收到如下消息-

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

也就是说,所有的引用都被剥离了。你知道吗

我要保留命令中的“”和“”引号。你知道吗

有人能提出一个解决办法吗?你知道吗


Tags: 命令hostdbdirupdatedescriptionwheresqlite3
3条回答

引用有几个层次。你知道吗

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

SELECT 'some string';

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

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

在Python中,必须对反斜杠和引号进行转义,以便将它们赋给shell:

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

(如何把'"混合在一起就剩下练习了……)

将包含命令名和参数的列表传递给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])

(如果您使用的是早于python2.7的版本,请将os.devnull替换为open('/dev/null', 'w')。)

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

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

相关问题 更多 >

    热门问题