Python子进程Grep

发布于 2021-01-29 16:49:54

我正在尝试使用subprocess模块​​在python脚本中使用grep命令。

这是我所拥有的:

userid = 'foo12'
p = subprocess.Popen(['grep', "%s *.log"%userid], stdout=subprocess.PIPE)

它什么也不返回。我不完全确定自己在做什么错,所以有人可以解释一下。我正在使用的当前方法有效,方法是添加shell =
true,使其输出正确的输出,但是正如帮助页面所指出的那样,这是不安全的。我需要帮助以使此工作正常进行,以便我的脚本不是不安全的。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我认为您遇到了两个问题:

    1. 这个电话:
      p = subprocess.Popen(['grep', "%s *.log"%userid]...
      

    除非shell=True将参数列表直接传递给os.execvp,否则它将无法按预期工作,这要求每个项目都是代表参数的单个字符串。您已经将
    两个单独的参数 压缩到一个字符串中(换句话说,grep将“ foo12 *.log”解释为要搜索的 模式 ,而不是模式+文件列表)。

    您可以通过以下方式解决此问题:

        p = subprocess.Popen(['grep', userid, '*.log']...)
    
    1. 第二个问题是,再次没有shell=Trueexecvp*.log将不知道您的意思并将其直接传递给grep,而无需通过外壳的通配符扩展机制。如果您不想使用shell=True,则可以执行以下操作:
      import glob
      

      args = [‘grep’, userid]
      args.extend(glob.glob(‘*.log’)
      p = subprocess.Popen(args, …)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看