Python plumbum:在 cmd 参数中传递 $

Python plumbum: Passing $ in an cmd argument

我正在尝试使用 plumbum 在 python 中执行以下命令:

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 之前插入一个额外的 \。

我应该如何将这个参数传递给 plumbum?

您可能遇到了命令行转义的限制。

我可以使用 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 解决方案与 sort 在处理唯一性时的工作方式并不完全相同。如果 2 行具有相同的第一个字段但第二个字段不相同,sort 保留其中一个,而 set 将保留两个。

编辑:未选中,但您刚刚确认它有效:只需调整您的 plumbum 代码:​​

separator = "-t\t"

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