gpt4 book ai didi

python - 从 python 调用的 grep 命令

转载 作者:太空狗 更新时间:2023-10-30 03:06:07 27 4
gpt4 key购买 nike

平台:Windows

查询:http://gnuwin32.sourceforge.net/packages/grep.htm

python :2.7.2

用于执行命令的 Windows 命令提示符。

我正在文件中搜索以下模式 "2345$"。文件内容如下:

abcd    2345

2345

abcd 2345$

grep "2345$"文件.txt

grep 成功返回 2 行(第一行和第二行)。

当我尝试通过 python 运行上述命令时,我没有看到任何输出。Python代码片段如下:

temp = open('file.txt', "r+")
grep_cmd = []
grep_cmd.extend([grep, '"2345$"' ,temp.name])
print grep_cmd
p = subprocess.Popen(grep_cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdoutdata = p.communicate()[0]
print stdoutdata

如果我有

grep_cmd.extend([grep, '2345$' ,temp.name])

在我的 python 脚本中,我得到了正确的答案。

问题是为什么grep命令用"

grep_cmd.extend([grep, '"2345$"' ,temp.name])

从 python 执行失败。 python不应该执行吗命令原样。

谢谢古奇。

最佳答案

不要在您的模式周围加上双引号。只需要在命令行上引用 shell 元字符。从 python 调用程序时,不需要这个。

您也不需要自己打开文件 - grep 会这样做:

grep_cmd.extend([grep, '2345$', 'file.txt'])

要了解不需要双引号并导致命令失败的原因,您需要了解双引号的用途及其处理方式。

Shell 使用双引号来防止对某些 Shell 元字符进行特殊处理。 Shell 元字符是 Shell 专门处理的那些字符,不会按字面意思传递给它执行的程序。最常用的 shell 元字符是“空格”。 shell 在空间边界上拆分命令以构建参数向量来执行程序。如果要在参数中包含空格,则必须以某种方式将其引用(单引号或双引号、反斜杠等)。另一种是美元符号($),用于表示变量扩展。

当您在不涉及 shell 的情况下执行程序时,所有这些关于引用和 shell 元字符的规则都不相关。在 python 中,您自己构建参数向量,因此相关的引用规则是 python 引用规则(例如,要在双引号字符串中包含双引号,在双引号前加上反斜杠 - 反斜杠不会出现在最后字符串)。完成构造后,参数向量的每个元素中的字符是将传递给您正在执行的程序的文字字符。

Grep 不会将双引号视为特殊字符,因此如果 grep 在其搜索模式中获得双引号,它将尝试从其输入中匹配双引号。

我原来的答案对 shell=True 的引用是不正确的 - 首先我没有注意到你最初指定了 shell=True,其次我是从这个角度来看的Unix/Linux 实现,而不是 Windows。

Python 子进程模块页面有关于 shell=True 和 Windows 的说法:

On Windows: the Popen class uses CreateProcess() to execute the child child program, which operates on strings. If args is a sequence, it will be converted to a string in a manner described in Converting an argument sequence to a string on Windows.

关于在 Windows 上将参数序列转换为字符串的链接部分对我来说没有意义。首先,字符串是一个序列,列表也是,但是“常用参数”部分对参数是这样说的:

args is required for all calls and should be a string, or a sequence of program arguments. Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names).

这与 Python 文档中描述的转换过程相矛盾,鉴于您观察到的行为,我会说文档是错误的,并且只应用于参数字符串,而不是参数向量。我自己无法验证这一点,因为我没有 Windows 或 Python 的源代码。

我怀疑如果你像这样调用 subprocess.Popen:

p = subprocess.Popen(grep + ' "2345$" file.txt', stdout=..., shell_True)

您可能会发现双引号作为记录的参数转换的一部分被去除了。

关于python - 从 python 调用的 grep 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542414/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com