Python subprocess.Popen带引号和反斜杠

时间:2013-06-06 19:55:11

标签: python bash subprocess popen

我想通过调用'sort'命令通过Python脚本对制表符分隔文件进行排序。 如果我用这个:

subprocess.Popen(["sort", r"-t$'t'", "-k1,2", "input", "-o", "output"]).wait()

我收到此错误:

sort: multi-character tab `$\'t\''

如果我使用shell=True

subprocess.Popen(["sort", r"-t$'t'", "-k1,2", "input", "-o", "output"], shell=True).wait()

这个过程刚刚挂起。

我更喜欢使用第一种方法,而不是shell=True。有什么建议吗?

编辑:文件很大。

2 个答案:

答案 0 :(得分:2)

Python可以创建带有选项卡的字符串;只有在直接在shell中工作时才需要$'\t'

subprocess.Popen(["sort", "-t\t", "-k1,2", "input", "-o", "output"]).wait()

答案 1 :(得分:0)

subprocess.call(r"sort -t\t -k1,2 input -o output")

看起来更干净 - call是子进程模块上比“Popen”更高级别的函数 - 并且会使您的代码更易于阅读。

可能,虽然调用外部“排序”可能有大型文件的某些设施(>可用内存的ammout) - 除非你与这些文件签约,否则你很可能犯错误。

与shell脚本不同,Python是自包含的,它可以在内部执行大多数任务,而不是通过外部简单的posix程序传递数据。

为了对名为“input”的文件进行排序并准备好在内存中使用结果,只需执行:

# read the data into a list, one line per item:
data = open("input", "rt").readlines()
# sort it, splitting the line on tab characters and taking the first two as key:
data.sort(key=lambda line: line.split("\t")[:2]

# and "data" contains a sorted list of your lines