在python中排序和uniq

时间:2014-07-22 15:32:38

标签: python shell sorting

我想在python中做一些shell命令。我有一个main.py,它调用了连续的函数,我发现它们中的一些更容易在shell中完成。问题:我想自动完成所有这些!

我想做这种代码:

sort fileIn | uniq > fileOut

我的问题是用管道来完成它。我试试:

from subprocess import call
call(['sort ',FileOut,'|',' uniq '])

 p1 = subprocess.Popen(['sort ', FileOut], stdout=subprocess.PIPE)
p2 = subprocess.Popen([" wc","-l"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output,err = p2.communicate()

但所有这些都行不通。 (注意:FileOut是一个字符串)

2 个答案:

答案 0 :(得分:1)

您需要使用shell=True,这会导致您的命令由shell运行,而不是使用exec系统调用:

call('sort {0} | uniq'.format(FileOut), shell=True)

值得注意的是,如果你只想在python中使用文件的唯一行(没有特定的顺序),那么没有 shell可能更容易:

unique_lines= set(open('filename').readlines())

答案 1 :(得分:0)

我厌倦了总是查看Popen模块文档,所以这是我用来包装Popen的实用程序功能的简略版本。您可以使用第一个调用的so参数并将其作为输入传递给下一个调用。如果需要,您还可以执行错误检查/解析。

def run(command, input=None)
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
    if input:
        so, se = process.communicate(input)
    else:
        so, se = process.communicate()
    rc = process.returncode
    return so, se, rc