你如何使用python的os.system()"回显"引号?

ins*_*-IT 3 python bash python-2.7

我正在尝试使用标准的bash脚本编写一个monit配置文件,如果是python的话os.system(),这个字符串是我想模仿的.

echo -e "\t" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用的os.system().它们都产生相同的结果.这些都没有写引号/etc/init.d/snortd00 start

   os.system('echo -e \"\t\" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')

   os.system('echo -e \"\t\" start program = \"\"/etc/init.d/snortd00 start\"\" >> /etc/monit.d/ips_svcs.monit')

   os.system('echo -e \"\t\" start program = "/etc/init.d/snortd00 start" >> /etc/monit.d/ips_svcs.monit')

   os.system('echo -e \"\t\" start program = "\"/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)

这是使用所有四个os.system()语句编写的内容.start program = /etc/init.d/snortd00 start

我正在寻找这个 start program = "/etc/init.d/snortd00 start"

Tom*_*ech 6

只需使用原始字符串以避免双重转义(一次用于python,一次用于shell):

cmd = r'echo -e "\t" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit'
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)

正如三元组在评论中指出的那样,os.system正在被子进程取代,所以上面的代码将改为:

subprocess.call(cmd, shell=True)
Run Code Online (Sandbox Code Playgroud)

更好的是,只需使用python:

with open("/etc/monit.d/ips_svcs.monit", "a") as file:
    file.write('\t  start program = "/etc/init.d/snortd00 start"\n')
Run Code Online (Sandbox Code Playgroud)

  • 也许切向地注意到`os.system()`被[subprocess`替换](https://docs.python.org/2/library/subprocess.html),尽管[推荐替代代码](https: //docs.python.org/2/library/subprocess.html#replacing-os-system)相当没有吸引力.但也许这只是为了鼓励你在有意义的时候使用Python自己的设施. (3认同)
  • 正确的Python代码建议+1 ...虽然,`write()`调用可能应该有一个换行符,因为它不像`print ...`那样自动添加... (2认同)

juh*_*ist 6

让我们考虑一下为什么您现有的方法不起作用:

在这种情况下,\由Python的处理,使外壳得到两个连续的“字符的外壳看到的。""/etc...""

os.system('echo -e \"\t\" start program = \""/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)

这与以前的相同:\由Python处理:

os.system('echo -e \"\t\" start program = \"\"/etc/init.d/snortd00 start\"\" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)

在这种情况下,shell会显示“ / etc ...”:

os.system('echo -e \"\t\" start program = "/etc/init.d/snortd00 start" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)

同样在这种情况下,Python处理\并且外壳程序看到""/etc...""

os.system('echo -e \"\t\" start program = "\"/etc/init.d/snortd00 start\"" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)

现在,您想要什么:

os.system('echo -e \"\t\" start program = \\"/etc/init.d/snortd00 start\\" >> /etc/monit.d/ips_svcs.monit')
Run Code Online (Sandbox Code Playgroud)

在这里,Python \\进入\Shell并看到Shell \",Shell 调用了echo真正看到的Shell 的转义机制"