【问题标题】:Python subprocess.Popen with quotes and backslashPython subprocess.Popen 带引号和反斜杠
【发布时间】:2013-06-06 19:55:11
【问题描述】:

我想通过调用“排序”命令通过 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。有什么建议吗?

编辑:文件很大。

【问题讨论】:

  • 首先,python擅长排序……为什么不用python来排序呢?其次,您希望-t 在您的排序命令中执行什么操作?你的字段分隔符真的是$'t'吗?
  • 您收到此错误是因为 subprocess 正在做它应该做的事情。尝试从 shell 运行 sort "-t$'t'" input,你会从 sort 得到完全相同的错误。
  • Python 擅长排序列表;对sort 程序进行炮击非常适合对可能非常大的文件进行排序。
  • @chepner -- 为什么sort 程序在处理大文件时要比 python 做得更好?据我所知,sort 没有进行任何外部合并排序以提高内存效率...
  • sort 当然适用于不完全适合主内存的文件(至少,我想我记得排序大于我可用内存的文件)。

标签: python bash subprocess popen


【解决方案1】:

Python 可以创建带有制表符的字符串; $'\t' 仅在您直接在 shell 中工作时才需要。

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

【讨论】:

  • 已删除。我没有费心测试它,这里没有理由使用 shell 来处理命令。
  • subprocess.check_call("sort", "-t\t", "-k1,2", "input", "-o", "output"]) 可以在这里使用,以引发错误异常。
【解决方案2】:

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

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

也许,虽然调用外部“排序”可能对大文件具有某些功能(> 可用内存的数量) - 除非您与这些不一致,否则您可能会弄错。

与 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多