1

我是一个学习 python 和在命令行中工作的新手,例如管道。

我读过鼓励子进程而不是os.system。我正在创建一个调用 shell 的脚本,但我无法使用子进程来完成它。不过,使用 os.system 很简单:

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

我已经成功地将 subprocess 用于其他命令,但不是那些将多个工具与“|”组合在一起的命令。阅读 subprocess python 文档令人困惑,对我没有帮助。我也尝试搜索其他问题,但找不到与我的问题类似的问题。这是我尝试过的(但失败了):

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

我也试过用 sp.Popen 代替 sp.call,但失败了。谁能帮忙提供一些清晰的例子和解释?谢谢!

4

2 回答 2

2

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

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

请注意,如果temp1.nametemp2.name来自不受信任的来源(例如,来自用户在 Web 应用程序中提供的数据),则使用shell=True存在安全风险。

于 2012-10-15T08:26:48.047 回答
2

值得一看的是伟大的库python 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")
于 2012-10-15T08:44:13.427 回答