子 - 使用多个命令行工具(Subprocess - using several command l

2019-09-24 03:09发布

我是一个新手学习到Python,并在命令行工作,如管道。

我读过子鼓励的方式,而不是使用os.system。 我创建一个脚本调用外壳和我一直无法使用子做。 使用使用os.system是易如反掌,但:

os.system("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " + temp2.name)

我用的子进程的成功为其他命令,而不是那些以组合多个工具“|”。 读子Python文档是令人困惑,而不是对我很有帮助。 我也试着寻找其他的问题,但找不到类似我的问题的东西。 这是我试过什么(失败):

subprocess.call = (["cut", "-f1-4", temp1.name, "|",  "uniq", "--count", "|", "sort". "-rn"], stdout = open(temp2.name, 'w'))

我也试图与sp.Popen代sp.call,但未能成功。 任何人都可以请一些明显的例子和说明帮助? 谢谢!

Answer 1:

如果你想使用管道应添加shell=True

subprocess.check_output("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " +    temp2.name, shell=True)

请注意,如果temp1.nametemp2.name来自非置信源(例如,从在web应用中由一个用户所提供的数据),使用shell=True是会带来安全隐患。



Answer 2:

这是值得考虑看看大图书馆蟒蛇SH ,它是Python的一个完整的子界面,使您可以调用任何程序,就好像它是一个功能,而更重要的是,这是令人愉快的Python的。

对于在这种情况下,您的特定需求,它提供了一些“先进的管道”功能,某事像这样:

# the inner command executes first, then sends its data to the outer command
from sh import *
sort(uniq(cut("-f1-4", _in="temp1.name"), "--count"), "-rn", _out="temp2.name")


文章来源: Subprocess - using several command line tools