使用os.system正确处理从Python转义的shell

5 unix sorting bash shell command-line

我在使用os.system命令从Python中正确地转义对shell的调用时遇到了麻烦.我正在尝试做相当于:

$ cat test | sort --stable -t $'\t' -k1,1
Run Code Online (Sandbox Code Playgroud)

从Python中传递给shell.

我试过了:

import os
cmd = "cat %s | sort --stable -t $'\\t' -k1,1" %("test")
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

sort: multi-character tab `$\\t'
Run Code Online (Sandbox Code Playgroud)

虽然它可以从shell中正常工作.我试图\t通过在Python中添加额外的斜杠来逃避,但我必须遗漏其他东西.知道如何解决这个问题吗?

谢谢.

Nat*_*han 5

os.system不像你期望的那样在正常的bash环境中执行命令.你可以自己简单地调用bash来解决它:

import os
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test"
os.system(cmd)
Run Code Online (Sandbox Code Playgroud)

但是你应该知道os.system已被标记为已弃用,并将在未来的python版本中删除.您可以使用模仿行为subprocess的方便方法call来验证您的代码os.system:

import subprocess
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test"
subprocess.call(cmd, shell=True)
Run Code Online (Sandbox Code Playgroud)

如果您感兴趣,有更多方法可以使用子进程模块进行调用:

http://docs.python.org/library/subprocess.html#module-subprocess