Python plumbum:在cmd参数中传递$

时间:2016-12-25 17:02:23

标签: python plumbum

我正在尝试使用plumbum在

sort -u -f -t$'\t' -k1,1 file1 > file2

但是,我在传递-t$'\t'参数时遇到问题。这是我的代码:

from plumbum.cmd import sort
separator = r"-t$'\t'"
print separator
cmd = (sort["-u", "-f", separator, "-k1,1", "file1"]) > "file2"
print cmd
print cmd()

我可以在print separatorprint cmd()执行后立即看到问题:

-t$'\t'
/usr/bin/sort -u -f "-t\$'\\t'" -k1,1 file1 > file2
  1. 参数用双引号括起来。
  2. 插入$和\ t之前的额外\。
  3. 我应该如何将此参数传递给plumbum?

1 个答案:

答案 0 :(得分:1)

您可能偶然发现了命令行转义的限制。

我可以使用subprocess模块使其工作,传递一个真正的制表字符:

import subprocess

p=subprocess.Popen(["sort","-u","-f","-t\t","-k1,1","file1",">","file2"],shell=True)
p.wait()

此外,完整的python简短解决方案可以满足您的需求:

with open("file1") as fr, open("file2","w") as fw:
    fw.writelines(sorted(set(fr),key=lambda x : x.split("\t")[0]))

完整的python解决方案在处理unicity时与sort完全不同。如果2行具有相同的第一个字段但不是相同的第二个字段,则sort保留其中一个字段,而set将保留其中一个字段。

编辑:未经检查,但您刚刚确认它有效:只需调整您的plumbum代码:

separator = "-t\t"

可以正常工作,虽然在3个中,我推荐完整的python解决方案,因为它不涉及外部进程,因此更加pythonic和便携。