如何在 os.system 命令中使用 escape/use 单引号和 python 2?
How do I escape/use single quotes in os.system command with python 2?
我已经构建了一个小脚本,它运行一个简单的 shell 实用程序,称为 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*^%%%^&)'
我想要实现的是 post 命令中的单引号本身。我试过“'”,反引号 - ``,转义引号 - \'\',将命令括在单引号,到目前为止没有任何效果
翻了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
方法 returns 一个元组,其中子进程的输出到 stdout
和 stderr
流。
如果你还想从子进程中读取输出到stderr
,更改代码如下:
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, errors = p.communicate()
print(output)
print(errors)
在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)
我已经构建了一个小脚本,它运行一个简单的 shell 实用程序,称为 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*^%%%^&)'
我想要实现的是 post 命令中的单引号本身。我试过“'”,反引号 - ``,转义引号 - \'\',将命令括在单引号,到目前为止没有任何效果
翻了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
方法 returns 一个元组,其中子进程的输出到 stdout
和 stderr
流。
如果你还想从子进程中读取输出到stderr
,更改代码如下:
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, errors = p.communicate()
print(output)
print(errors)
在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)