python - 如何正确转义python子进程中的特殊字符?

标签 python python-2.7 subprocess

我尝试使用 python 子进程运行这个 bash 命令

find /Users/johndoe/sandbox -iname "*.py" | awk -F'/' '{ print $NF}'

输出:-

helld.xl.py
parse_maillog.py
replace_pattern.py
split_text_match.py
ssh_bad_login.py

这是我以 python2.7 方式所做的,但它给出了 awk 命令过滤器不起作用的输出

>>> p1=subprocess.Popen(["find","/Users/johndoe/sandbox","-iname","*.py"],stdout=subprocess.PIPE)

>>> p2=subprocess.Popen(['awk','-F"/"','" {print $NF} "'],stdin=p1.stdout,stdout=subprocess.PIPE)

>>>p2.communicate()
('/Users/johndoe/sandbox/argparse.py\n/Users/johndoe/sandbox/custom_logic_substitute.py\n/Users/johndoe/sandbox/finditer_html_parse.py\n/Users/johndoe/sandbox/finditer_simple.py\n/Users/johndoe/sandbox/group_regex.py\n/Users/johndoe/sandbox/helo.py\n/Users/johndoe/sandbox/newdir/helld.xl.py\n/Users/johndoe/sandbox/parse_maillog.py\n/Users/johndoe/sandbox/replace_pattern.py\n/Users/johndoe/sandbox/split_text_match.py\n/Users/johndoe/sandbox/ssh_bad_login.py\n', None)

我也可以通过单独使用 p1 来获得输出,如下所示,但我无法让 awk 在这里工作

list1=[]
result=p1.communicate()[0].split("\n")
for item in res:
    a=item.rstrip('/').split('/')
    list1.append(a[-1])
print list1

最佳答案

当您不调用 shell 时,您错误地传递了 shell 引用(以及 shell 甚至不需要的额外 shell 引用!)。不要这样做。

p2=subprocess.Popen(['awk', '-F/', '{print $NF}'], stdin=...

当你有 shell=True 时,你需要在一些参数周围加上额外的引号来保护它们免受 shell 的影响,但是这里没有 shell,所以将它们放入是不正确的,并且会导致解析错误awk。

但是,您几乎不需要从 Python 调用 Awk,特别是对于 Python 可以轻松本地完成的琐碎任务:

list1 = [line.split('/')[-1]
            for line in subprocess.check_output(
                ["find", "/Users/johndoe/sandbox",
                 "-iname", "*.py"]).splitlines()]

在这种特殊情况下,还要注意 GNU find 已经具有直接生成此结果的工具:

list1 = subprocess.check_output(
    ["find", "/Users/johndoe/sandbox",
     "-iname", "*.py", "-printf", "%f\\n"]).splitlines()

关于python - 如何正确转义python子进程中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47498642/

相关文章:

Python子进程模块: send string to two chained subprocesses

python - 虚拟环境错误 : the executable in env/bin/python is not functioning

python - 使用 opencv 从二进制图像中分割楔形

python - 在 if 语句中比较三个变量

python - 在满足要求时撤消功能

Python 无法与 Minecraft 服务器的子进程通信

python 迭代且优雅地合并字典?

python - 创建一个循环将列表中的整数更改为另一个整数?

javascript - 需要一种设计模式来仅获取跨类通用的特定功能

python - 在 Python 3.7+ 中使用 subprocess.run 进行多个输入