目前我正在做以下操作,但我相信肯定有一个库函数可以实现这个,或者至少有一个更优雅/稳健/高效的选项:
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
编辑:我接受了使用引号的简单答案,不知道为什么我没有想到;我猜是因为我来自Windows,其中'和"的行为有些不同。
关于安全性,我理解大家的担忧,但在这种情况下,我对os.system()提供的快速简便的解决方案感兴趣,而字符串的来源要么不是用户生成的,要么至少由可信任的用户(即我)输入。
sh_escape
函数应该转义掉;
和空格,并通过创建一个名为foo.txt\;\ rm\ -rf\ /
的文件来消除安全问题。 - Tom