我是学习python的新手并在命令行中工作,例如管道
我已经读过鼓励子进程而不是os.system。我正在创建一个调用shell的脚本,我无法使用子进程来完成它。使用os.system虽然很简单:
os.system("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " + temp2.name)
我已经成功地将subprocess用于其他命令,但不是那些将多个工具与“|”组合在一起的命令。阅读子进程python文档很困惑,对我没有帮助。我也尝试过搜索其他问题,但找不到与我的问题类似的东西。这就是我尝试过的(并且失败了):
subprocess.call = (["cut", "-f1-4", temp1.name, "|", "uniq", "--count", "|", "sort". "-rn"], stdout = open(temp2.name, 'w'))
我也尝试用sp.Popen替换sp.call,但失败了。有人可以帮忙解决一些明确的例子和解释吗? 谢谢!
答案 0 :(得分:2)
如果您想使用管道,则应添加shell=True
subprocess.check_output("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " + temp2.name, shell=True)
请注意,如果temp1.name
或temp2.name
来自不受信任的来源(例如来自用户在网络应用程序中提供的数据)使用shell=True
,则存在安全隐患。
答案 1 :(得分:2)
值得一看的是伟大的库python sh,它是一个完整的Python子过程接口,它允许你调用任何程序,就像它是一个函数一样,更重要的是,它是令人愉悦的pythonic。
在这种情况下,根据您的具体需要,它提供了一些“高级管道”功能,如下所示:
# 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")