如何使用python 2在os.system命令中转义/使用单引号?

时间:2018-09-03 22:48:39

标签: python escaping quotes

我建立了一个小脚本,运行一个名为imapsync的简单外壳实用程序,并从字典中获取一堆变量,命令如下:

os.system("imapsync --host1 %s --user1 %s --password1 '%s' --host2 %s --user2 %s --password2 '%s' --ssl1 --no-modulesversion --ssl2" % (fromHost, emails, passwords, toHost, emails, passwords))

关键是密码通常包含特殊字符,例如:djDJS * ^ %%% ^&)

如果用单引号引起来,则此imapsync工具允许此类字符:“ djDJS * ^ %%% ^&)”

我想要实现的是在命令本身中添加单引号。我尝试了“'”,反引号-,转义引号-\'\',将命令括在单引号中,因此没有任何效果远

2 个答案:

答案 0 :(得分:0)

仔细阅读imapsync的文档后,我发现建议附上passwords in double quotes within single quotes to avoid common problems

由于您已经使用双引号将字符串开头,因此必须使用反斜杠\"对密码周围的双引号进行转义。

您还可以做两件事来使您的代码变得更好。 首先,您可以使用.format syntax for string formatting代替旧的%语法。

第二次将os.system替换为subprocess.Popen。这样,您就可以将命令字符串拆分为所有参数的列表,看起来更加清晰。

您的新代码如下

import subprocess

args = [
  "imapsync",
  "--host1",
  fromHost,
  "--user1",
  emails,
  "--password1",
  "'\"{}\"'".format(passwords),
  "--host2",
  toHost,
  "--user2",
  emails,
  "--password2",
  "'\"{}\"'".format(passwords),
  "--ssl1",
  "--no-modulesversion",
  "--ssl2"
]

p = subprocess.Popen(args, stdout=subprocess.PIPE)

output = p.communicate()[0]

print(output)

在此示例中,Popen.communicate用于将imapsync命令的输出收集为字符串。 communicate方法将一个元组及其子流程的输出返回到stdoutstderr流。

如果您还想从子流程中读取到stderr的输出,请按以下所示更改代码:

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

output, errors = p.communicate()

print(output)
print(errors)

答案 1 :(得分:-1)

在Python中传递字符串参数的最佳格式是使用格式字符串方法。您可以执行以下操作:

line_command = "imapsync --host1 {fromHost} --user1 {emails} --password1 '\"{passwords}\"' --host2 {toHost} --user2 {emails} --password2 '\"{passwords}\"' --ssl1 --no-modulesversion --ssl2".format(fromHost=fromHost, emails=emails, passwords=passwords, toHost=toHost)
os.system(line_command)