为什么运行Python子进程grep会忽略excludedir标志

2024-10-03 02:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

从终端执行此命令时:

\grep -inH -r --exclude-dir={node_modules,.meteor,.git} -e test -- /Users/nelsyeung/Sites/foo

它输出正确的结果,其中排除了--exclude-dir目录。你知道吗

理论上,以下Python脚本应该执行完全相同的操作:

#!/usr/bin/env python3
from subprocess import Popen, PIPE

cmd = 'grep -inH -r --exclude-dir={node_modules,.meteor,.git} -e test -- /Users/nelsyeung/Sites/foo'
with Popen(cmd.split(), stdout=PIPE, bufsize=1, universal_newlines=True) as p:
    for l in p.stdout:
        print(l)

但是--exclude-dir标志似乎被忽略了,也就是说,它也是来自node_modules.meteor.git的grep。你知道吗

问题:为什么上面的代码输出的结果与执行命令不同?你知道吗

请注意,这比我寻找替代解决方案更像是一个理论问题,因为Python代码基本上来自我正在使用的插件,我只能为命令提供标志,而且令我惊讶的是,传入--exclude-dir什么也做不了。如果上面的代码有问题,一定要指出。你知道吗

系统信息:

  • 操作系统:macOS 10.13.6
  • Python:3.7.0版
  • grep:(BSD grep)2.5.1-FreeBSD(支持--exclude-dir

Tags: 代码testgit命令modulesnodefoodir
1条回答
网友
1楼 · 发布于 2024-10-03 02:35:15

exclude-dir={dir1,dir2}is expanded to

 exclude-dir=dir1  exclude-dir=dir2

是壳牌公司,而不是格雷普公司。Popen默认情况下使用shell=False。你知道吗

所以用

from subprocess import Popen, PIPE

cmd = '''grep -inH -r  exclude-dir=node_modules  exclude-dir=.meteor 
          exclude-dir=.git -e test   /Users/nelsyeung/Sites/foo'''
with Popen(cmd.split(), stdout=PIPE, bufsize=1, universal_newlines=True) as p:
    for l in p.stdout:
        print(l)

(请注意,虽然使用shell=True可能是另一种选择,但由于security issues的原因,它不是首选。)

相关问题 更多 >